Ergebnis 1 bis 5 von 5

Thema: trigger / syntax

  1. #1
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard trigger / syntax

    Hallo,

    ich habe mir eine Triggerfunktion gebaut die bei Änderung der Tabelle einen in der selben Tabelle enthaltenen Suchindex aktualisiert:
    Code:
    CREATE FUNCTION search_editionnames_trigger() RETURNS trigger AS $$
    begin
        new.textsearchable_index_gin :=
            setweight(to_tsvector(new.title_lang, coalesce(new.title,'')), 'A') ||
            setweight(to_tsvector('pg_catalog.simple', coalesce(e.isbn10,'')), 'C')
            FROM  editions e
            WHERE new.editionid = e.editionid;
        return new;
    end
    $$ LANGUAGE plpgsql;
    und dann der Trigger
    Code:
    CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE
    ON editionnames FOR EACH ROW EXECUTE PROCEDURE search_editionnames_trigger();
    Nun möchte ich jedoch, dass das tsvector-feld auch aktualisiert wird wenn sich in der anderen Tabelle (editions) etwas (isbn10) ändert. Damit komm ich aber nicht zurande.
    Bezieht sich das 'new' in meinem Beispiel auf die geänderte Tabelle oder auf die zu aktualisierende durch den Trigger? In meinem Beispiel ist das ja komfortabelerweise die selbe Tabelle...

    Danke für Hilfe

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

    Standard

    NEW und OLD sind jeweils die Zeilen aus der geänderten Tabelle.
    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
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard

    Irgendwie versteh ich gar nicht wie das gehen soll. Sobald ich nach 'begin' nicht mit new.irgenwas anfange bekomme ich einen syntaxfehler. Wie soll ich der Triggerfunktion aber mitteilen dass er nicht in der getriggerten Tabelle was ändern soll sondern in einer zweiten?
    In meinem Beispiel oben ist ja die getriggerte gleichzeitig auch die zu aktualisierende Tabelle. Deswegen brauch in der Funktion auch der Name der zu aktualisierenden Tabelle nicht enthalten zu sein und wird hier einfach mal 'new' genannt obwohl die eigentlich 'editionnames' heißt wie aus dem Trigger ersichtlich. Aber wie bringe ich der Funktion bei eine andere als die getriggerte Tabelle zu aktualisieren?

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

    Standard

    Zitat Zitat von strippenzieher Beitrag anzeigen
    Irgendwie versteh ich gar nicht wie das gehen soll. Sobald ich nach 'begin' nicht mit new.irgenwas anfange bekomme ich einen syntaxfehler. Wie soll ich der Triggerfunktion aber mitteilen dass er nicht in der getriggerten Tabelle was ändern soll sondern in einer zweiten?
    In meinem Beispiel oben ist ja die getriggerte gleichzeitig auch die zu aktualisierende Tabelle. Deswegen brauch in der Funktion auch der Name der zu aktualisierenden Tabelle nicht enthalten zu sein und wird hier einfach mal 'new' genannt obwohl die eigentlich 'editionnames' heißt wie aus dem Trigger ersichtlich. Aber wie bringe ich der Funktion bei eine andere als die getriggerte Tabelle zu aktualisieren?
    Code:
    test=# create table t1 (i int);
    CREATE TABLE
    test=*# create table t2 (i int);
    CREATE TABLE
    test=*# create or replace function trg_t1() returns trigger as $$begin insert into t2 (i) values (new.i); return new; end; $$language plpgsql;
    CREATE FUNCTION
    test=*# create trigger trg1 before insert on t1 for each row execute procedure trg_t1();
    CREATE TRIGGER
    test=*# insert into t1 values (5);
    INSERT 0 1
    test=*# select * from t2;
     i
    ---
     5
    (1 row)
    Reicht das als Hilfe?


    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
    strippenzieher ist offline Benutzer
    Registriert seit
    22.01.2011
    Beiträge
    57

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Code:
    test=# create table t1 (i int);
    CREATE TABLE
    test=*# create table t2 (i int);
    CREATE TABLE
    test=*# create or replace function trg_t1() returns trigger as $$begin insert into t2 (i) values (new.i); return new; end; $$language plpgsql;
    CREATE FUNCTION
    test=*# create trigger trg1 before insert on t1 for each row execute procedure trg_t1();
    CREATE TRIGGER
    test=*# insert into t1 values (5);
    INSERT 0 1
    test=*# select * from t2;
     i
    ---
     5
    (1 row)
    Reicht das als Hilfe?
    Andreas
    Ja, vielen Dank. Hier finde ich mich zurecht. Sind das gleichwertige Schreibweisen? Immerhin könnte man das ja auch mit der ersten Version und einem richtigen SQL-Befehl machen. Worin besteht der Unterschied - Performance, Flexibilität?

Ähnliche Themen

  1. UPDATE Trigger oder INSERT Trigger
    Von traxanos im Forum Trigger und Funktionen
    Antworten: 8
    Letzter Beitrag: 18.05.2010, 12:59
  2. SQL syntax help
    Von Woltan im Forum SQL
    Antworten: 3
    Letzter Beitrag: 16.04.2009, 10:07
  3. Frage Constraint Syntax
    Von furianer im Forum Programmierung
    Antworten: 6
    Letzter Beitrag: 24.09.2008, 13:52
  4. Syntax-Fehler
    Von Pegasus0211 im Forum Programmierung
    Antworten: 4
    Letzter Beitrag: 17.10.2006, 13:37
  5. SQL Syntax überprüfen
    Von chrimp im Forum SQL
    Antworten: 10
    Letzter Beitrag: 25.07.2006, 18:43

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