我正在研究我的第一个触发器。当我在表上执行INSERT时,我想条件性地从其他表中删除行。
这是一个触发器:
CREATE OR REPLACE FUNCTION clear_seen_by()
RETURNS trigger AS
$BODY$
BEGIN
IF (OLD.popup = '1') THEN
DELETE FROM news_seen_by;
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
由:
调用 CREATE TRIGGER clear_seen_by
AFTER INSERT
ON news
FOR EACH STATEMENT
EXECUTE PROCEDURE clear_seen_by();
作为错误,我看到NEW或OLD(如果我通知触发器)未声明/未知。问题在哪里?
答案 0 :(得分:1)
在INSERT语句中,您没有定义OLD
条记录。
您应该使用NEW.popup
代替,并将触发器声明为FOR EACH ROW
。
CREATE OR REPLACE FUNCTION clear_seen_by() RETURNS trigger AS
$BODY$
BEGIN
IF (NEW.popup = '1') THEN
DELETE FROM news_seen_by;
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
CREATE TRIGGER
clear_seen_by
AFTER INSERT ON
news
FOR EACH ROW EXECUTE PROCEDURE
clear_seen_by();
答案 1 :(得分:1)
您声明了触发器FOR EACH STATEMENT
。也许你需要FOR EACH ROW
?
FOR EACH STATEMENT
触发器没有NEW
和OLD
。