Cod*_*lan 10 postgresql triggers
我有一个tsvector
列,我想在行更改时更新.对于INSERT
我正在使用此触发器:
CREATE TRIGGER albums_vector_insert BEFORE INSERT
ON albums
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('search_vector', 'pg_catalog.english', 'name')
Run Code Online (Sandbox Code Playgroud)
看似合适.我想在UPDATE
子句上使用另一个触发器,但我只想在名称实际更改时触发它,所以我不会浪费周期不必要地更新搜索向量.我试过这个:
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;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试创建触发器时,这会引发2个错误:
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
^
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果我使用触发器程序语法,ala:
CREATE OR REPLACE FUNCTION something() RETURNS TRIGGER
然后将我的函数与触发器关联,然后我将无法使用内置tsvector_update_trigger
函数,并且需要自己处理ts_vector
操作.因此我尝试使用all-in-one-trigger-procedure语法...
有任何想法吗?
Cod*_*lan 14
这就是我最终得到的结果:
CREATE FUNCTION albums_vector_update() RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
new.search_vector = to_tsvector('pg_catalog.english', COALESCE(NEW.name, ''));
END IF;
IF TG_OP = 'UPDATE' THEN
IF NEW.name <> OLD.name THEN
new.search_vector = to_tsvector('pg_catalog.english', COALESCE(NEW.name, ''));
END IF;
END IF;
RETURN NEW;
END
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON albums
FOR EACH ROW EXECUTE PROCEDURE albums_vector_update();
Run Code Online (Sandbox Code Playgroud)