Mam kolumnę tsvector
, którą chcę zaktualizować po zmianie wiersza. Dla INSERT
Używam tego wyzwalania:Używanie wyzwalacza aktualizacji tsvector w wyzwalaczu Postgres wyzwala
CREATE TRIGGER albums_vector_insert BEFORE INSERT
ON albums
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('search_vector', 'pg_catalog.english', 'name')
który działa dobrze, pozornie. Chciałbym użyć innego wyzwalacza na klauzulach UPDATE
, ale chcę, aby był uruchamiany tylko wtedy, gdy nazwa rzeczywiście się zmienia, więc nie marnuję cykli aktualizowania wektora wyszukiwania niepotrzebnie. Próbowałem to:
CREATE TRIGGER albums_vector_update BEFORE UPDATE ON albums
FOR EACH ROW EXECUTE PROCEDURE
IF NEW.name <> OLD.name THEN
tsvector_update_trigger(search_vector, 'pg_catalog.english', name);
END IF;
Ale to rzuca 2 błędy podczas próby utworzenia spust:
Error : ERROR: syntax error at or near "NEW"
LINE 3: IF NEW.name <> OLD.name THEN
^
Error : ERROR: syntax error at or near "IF"
LINE 1: END IF
^
Z mojego zrozumienia, jeśli mogę użyć składni procedura wyzwalania, Ala:
CREATE OR REPLACE FUNCTION something() RETURNS TRIGGER
następnie skojarz moją funkcję z wyzwalaczem, wtedy nie będę mógł korzystać z wbudowanej funkcji tsvector_update_trigger
i będę musiał obsługiwać ts_vector
samemu. Stąd moje próby użycia składni procedury all-in-one-trigger + ...
Jakieś pomysły?
Występuje literówka w kodzie. Powinieneś mieć wyzwalacz PRZED WSTAWIĆ LUB AKTUALIZACJĄ, ponieważ NOWY jest ignorowany w przypadku wyzwalaczy AFTER. –
@omatrot tak masz rację! Naprawiłem - dzięki za napiwek. –