trigger / syntax

Hallo,

ich habe mir eine Triggerfunktion gebaut die bei Änderung der Tabelle einen in der selben Tabelle enthaltenen Suchindex aktualisiert:

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

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

NEW und OLD sind jeweils die Zeilen aus der geänderten Tabelle.

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?



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?