在DELETE触发器之前更新对象无效

时间:2018-06-21 10:14:40

标签: sql postgresql database-trigger

我需要清理另一个对象中的已删除对象,该对象将其用作外键,为此我使用了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仍然存在。

1 个答案:

答案 0 :(得分:3)

此行为在the documentation中进行了描述:

  

已触发行BEFORE的行级触发器可以返回null,以指示触发器管理器跳过此行的其余操作(即,不触发后续触发器,而INSERT / {{ 1}} / UPDATE在此行中不会出现)。如果返回非null值,则操作以该行值继续。

使用DELETE代替RETURN OLD;