Ergebnis 1 bis 7 von 7

Thema: Einem Trigger Feldnamen übergeben

  1. #1
    az_hf0 ist offline Neuer Benutzer
    Registriert seit
    15.06.2009
    Beiträge
    23

    Standard Einem Trigger Feldnamen übergeben

    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:
    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:
    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

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    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

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

    PostgreSQL Service & Support

  3. #3
    az_hf0 ist offline Neuer Benutzer
    Registriert seit
    15.06.2009
    Beiträge
    23

    Standard

    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

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von az_hf0 Beitrag anzeigen
    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

  5. #5
    az_hf0 ist offline Neuer Benutzer
    Registriert seit
    15.06.2009
    Beiträge
    23

    Standard

    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

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von az_hf0 Beitrag anzeigen
    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

  7. #7
    az_hf0 ist offline Neuer Benutzer
    Registriert seit
    15.06.2009
    Beiträge
    23

    Standard

    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

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum