NEW und OLD sind jeweils die Zeilen aus der geänderten Tabelle.
Hallo,
ich habe mir eine Triggerfunktion gebaut die bei Änderung der Tabelle einen in der selben Tabelle enthaltenen Suchindex aktualisiert:
und dann der TriggerCode: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;
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.Code:CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON editionnames FOR EACH ROW EXECUTE PROCEDURE search_editionnames_trigger();
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.
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
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?
Reicht das als Hilfe?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)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen