Einem Trigger Feldnamen übergeben

Probleme und Fragen zum Thema Trigger und Funktionen.

Einem Trigger Feldnamen übergeben

Beitragvon az_hf0 » Mi 5. Mai 2010, 15:52

Hallo zusammen,

ich habe ein kleines Syntaxproblem, bei dem ich Euch um euren Rat fragen wollte:

Ein generischer Trigger soll bei mir dafür sorgen, dass ein Wert berechnet wird. Vereinfacht dargestellt, hab ich mir das so gedacht:

Code: Alles auswählen
CREATE OR REPLACE FUNCTION bla.tsv_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
  new.tsv := setweight(to_tsvector('pg_catalog.english', new.title));
  return new;
END
$BODY$;
Nun möchte ich gerne diesem Trigger beim Aufruf einen (später dann mehrere) Parameter übergeben...

Code: Alles auswählen
CREATE TRIGGER tsv_update
  BEFORE INSERT OR UPDATE
  ON bla.test
  FOR EACH ROW
  EXECUTE PROCEDURE bla.tsv_trigger('title');
und auf diese im Trigger über z.B. TG_ARGV[0] zugreifen und die Zuweisung beeinflussen.
Also ungefähr so:

new.tsv := setweight(to_tsvector('pg_catalog.english', new.TG_ARGV[0]));

Das ist natürlich syntaktisch nicht korrekt. Könnt ihr mir sagen, wie ich auf ein Feld zugreifen kann, dessen Namen ich in einer Variable halte?

Ich möchte gerne über den mit übergebenen Namen das entsprechende Feld in die Gewichtung einrechnen.

Vielen Danke für Eure Hilfe,
az_hf0
az_hf0
Neuer Benutzer
 
Beiträge: 23
Registriert: Mo 15. Jun 2009, 16:25

Beitragvon ads » Mi 5. Mai 2010, 19:23

Wie wäre es nur mit TG_ARGV[0]? Zumindest ist die Dokumentation zu diesem Thema vorhanden, einfach mal dort hineinschauen.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon az_hf0 » Do 6. Mai 2010, 01:03

Vielleicht habe ich das etwas mißverständlich ausgedrückt:

Ich möchte den Trigger auf der Tabelle

TABLE bla.test
title: text
tsv: tsvector

aufrufen:

CREATE TRIGGER tsv_update
BEFORE INSERT OR UPDATE
ON bla.test
FOR EACH ROW
EXECUTE PROCEDURE bla.tsv_trigger('title');
In der Triggerfunktion möchte ich dann dynamisch über TG_ARGV[0] den *Namen der Tabellenspalte* ermitteln, aus der ich lesen möchte. In diesem Fall also möchte ich aus der Spalte/Attribut 'title' lesen, also auf new.title zugreifen. Ich möchte nicht den Wert 'title' erhalten, sondern über eine Indirektion sozusagen dereferenzieren.

Dazu kann ich in der Dokumentation nichts finden. Vielleicht hast du einen Tipp, wo ich etwas über diese Dereferenzierung nachlesen kann?

Grüße
az_hf0
az_hf0
Neuer Benutzer
 
Beiträge: 23
Registriert: Mo 15. Jun 2009, 16:25

Beitragvon akretschmer » Do 6. Mai 2010, 06:45

az_hf0 hat geschrieben:In der Triggerfunktion möchte ich dann dynamisch über TG_ARGV[0] den *Namen der Tabellenspalte* ermitteln, aus der ich lesen möchte.


Dann hast Du somit ein dynamisches SQL, welches Du ausführen willst -> guggst Du EXECUTE 'your query'.

PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Basic Statements

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon az_hf0 » Do 6. Mai 2010, 09:44

Hallo Andreas,

ich hatte mir bereits überlegt, EXECUTE... zu verwenden. Das trifft es jedoch nicht ganz, da ich einen BEFORE INSERT OR UPDATE Trigger verwende. Der Wert, an den ich rankommen möchte verbirgt sich hinter

new.{Wert in TG_ARGV[0]}

Wenn also in TG_ARGV[0] der String 'title' steckt, möchte ich gerne auf new.title zugreifen. Das klappt mit EXECUTE doch so nicht, oder?

Grüße
az_hf0
az_hf0
Neuer Benutzer
 
Beiträge: 23
Registriert: Mo 15. Jun 2009, 16:25

Beitragvon akretschmer » Do 6. Mai 2010, 10:16

az_hf0 hat geschrieben:Hallo Andreas,

ich hatte mir bereits überlegt, EXECUTE... zu verwenden. Das trifft es jedoch nicht ganz, da ich einen BEFORE INSERT OR UPDATE Trigger verwende. Der Wert, an den ich rankommen möchte verbirgt sich hinter

new.{Wert in TG_ARGV[0]}

Wenn also in TG_ARGV[0] der String 'title' steckt, möchte ich gerne auf new.title zugreifen. Das klappt mit EXECUTE doch so nicht, oder?

Grüße
az_hf0


Lies den Link nochmals.

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon az_hf0 » Di 18. Mai 2010, 18:10

Hallo,

wir haben im Büro etwas gekränkelt und da hat es etwas gedauert, bis wir uns wieder voll und ganz unserem Problem widmen konnten.
Vielen Dank nochmal für eure Tips. Ihr lagt (wie immer) goldrichtig.

Ich habe das ganze jetzt mit meinem Kollegen so gelöst:
EXECUTE 'SELECT $1.' || column_name INTO column_value USING new;

Grüße
az_hf0
az_hf0
Neuer Benutzer
 
Beiträge: 23
Registriert: Mo 15. Jun 2009, 16:25


Zurück zu Trigger und Funktionen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron