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…
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?
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?