PostgreSQL 触发器不工作 - 无论是在删除之前还是之后

问题描述 投票:0回答:1
我刚刚放弃了 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,则进程表根本不会执行删除,并会显示错误“此行没有唯一标识符”。

有人可以建议吗?

postgresql triggers plpgsql
1个回答
22
投票
问题2

您的触发函数结束于:

RETURN NULL;
跳过触发事件的执行。 

说明书:

行级触发器触发

BEFORE

 可以返回 null 来表示
触发管理器跳过该行的其余操作(即
后续触发器不会被触发,并且 INSERT
/
UPDATE
/
DELETE
该行不会发生)。

要继续删除该行,请将其替换为:

RETURN OLD;

原因如下:

DELETE 上有 before-trigger

 的情况下,返回值没有
直接效果,但它必须是 
nonnull 才能允许触发操作 继续。请注意,在 NEW
 触发器中,
DELETE
 为空,因此返回该值
通常是不明智的。 
DELETE
触发器中的常用习惯用法是
返回
OLD

我的粗体强调。

问题1

我认为你的触发器和触发器功能没有理由不能像

AFTER DELETE

那样工作。显然,表 
process_id
 中必须存在具有匹配 
workflow
 的行。

© www.soinside.com 2019 - 2024. All rights reserved.