PostgreSQL触发器无法正常工作 - 既不是BEFORE也不是AFTER DELETE

时间:2012-05-21 14:51:24

标签: postgresql triggers plpgsql

我刚刚离开了MySQL而支持PostgreSQL,我对触发器有疑问。此触发器旨在更新“工作流程”中的字段。如果在'进程中删除了一行,则表格为'表

CREATE OR REPLACE FUNCTION fn_process_delete() RETURNS TRIGGER AS $$
BEGIN
    UPDATE workflow SET deleted_process_name = OLD.process_name
    WHERE process_id = OLD.process_id;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS process_delete ON processes;
CREATE TRIGGER process_delete
AFTER DELETE ON processes
FOR EACH ROW 
EXECUTE PROCEDURE fn_process_delete();

我的问题是双重的:

  1. 如果我如上所述使用AFTER DELETE,则该行将被删除,但更新语句不会更新“工作流程”中的字段。表。

  2. 如果我使用BEFORE DELETE,则进程表根本不会执行删除操作并发出错误,说明"此行没有唯一标识符"。

  3. 有人可以提供建议吗?

1 个答案:

答案 0 :(得分:16)

问题2:

您的触发功能以:

结束
RETURN NULL;

这样就可以跳过触发事件的执行。 Per documentation on trigger procedures

  

触发的行级触发器 BEFORE 可以返回null来发出触发信号   经理跳过这一行的其余操作(即   不会触发后续触发器,而INSERT / UPDATE / DELETE会触发   这一行没有出现。)

您需要将其替换为:

RETURN OLD;

让系统继续删除该行。原因如下:

  

如果DELETE上的触发前,则返回值为no   直接效果,但必须非空才能允许触发操作   继续。请注意,NEW触发器中DELETE为空,因此返回该值   通常是不明智的。 DELETE触发器中通常的习惯用语是   返回OLD

大胆强调我的。

问题1

我认为没有理由说你的触发器和触发器功能不能用作AFTER DELETE。不言而喻,表process_id中必须存在匹配workflow的行。