我需要清理另一个对象中的已删除对象,该对象将其用作外键,为此我使用了BEFORE DELETE
触发器。我不知道为什么下面的代码不起作用。
更奇怪的是,如果我依次执行UPDATE查询和DELETE查询,则该行将被正确删除。
CREATE OR REPLACE FUNCTION cleanNoteEventConnections() RETURNS TRIGGER AS $$
DECLARE
BEGIN
EXECUTE 'update invoice set "noteEvent"=null where "noteEvent"=' || OLD.id;
RETURN NULL;
END;
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER cleanNoteEventConnections BEFORE DELETE ON note_event
FOR EACH ROW EXECUTE PROCEDURE cleanNoteEventConnections();
这是删除查询后在pgAdmin控制台中看到的内容:
delete from note_event where id=34
result: Query returned successfully: 0 rows affected, 11 msec execution time.
ID为34的note_event
仍然存在。
答案 0 :(得分:3)
此行为在the documentation中进行了描述:
已触发行
BEFORE
的行级触发器可以返回null,以指示触发器管理器跳过此行的其余操作(即,不触发后续触发器,而INSERT
/ {{ 1}} /UPDATE
在此行中不会出现)。如果返回非null值,则操作以该行值继续。
使用DELETE
代替RETURN OLD;
。