我刚刚离开了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();
我的问题是双重的:
如果我如上所述使用AFTER DELETE,则该行将被删除,但更新语句不会更新“工作流程”中的字段。表。
如果我使用BEFORE DELETE,则进程表根本不会执行删除操作并发出错误,说明"此行没有唯一标识符"。
有人可以提供建议吗?
答案 0 :(得分:16)
您的触发功能以:
结束RETURN NULL;
这样就可以跳过触发事件的执行。 Per documentation on trigger procedures:
触发的行级触发器
BEFORE
可以返回null来发出触发信号 经理跳过这一行的其余操作(即 不会触发后续触发器,而INSERT
/UPDATE
/DELETE
会触发 这一行没有出现。)
您需要将其替换为:
RETURN OLD;
让系统继续删除该行。原因如下:
如果
DELETE
上的触发前,则返回值为no 直接效果,但必须非空才能允许触发操作 继续。请注意,NEW
触发器中DELETE
为空,因此返回该值 通常是不明智的。DELETE
触发器中通常的习惯用语是 返回OLD
。
大胆强调我的。
我认为没有理由说你的触发器和触发器功能不能用作AFTER DELETE
。不言而喻,表process_id
中必须存在匹配workflow
的行。