加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:09:27 所属栏目:百科 来源:网络整理
导读:我刚刚离开 MySQL而支持PostgreSQL,我对触发器有疑问.如果在“进程”表中删除了一行,则此触发器用于更新“工作流”表中的字段. CREATE OR REPLACE FUNCTION fn_process_delete() RETURNS TRIGGER AS $$BEGIN UPDATE workflow SET deleted_process_name = OLD
我刚刚离开 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,则该行将被删除,但update语句不会更新“workflow”表中的字段.
>如果我使用BEFORE DELETE,则进程表将根本不执行删除,并发出错误消息“此行没有唯一标识符”.

任何人都可以建议吗?

问题2:

您的触发器功能以:

RETURN NULL;

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

Row-level triggers fired BEFORE can return null to signal the trigger
manager to skip the rest of the operation for this row (i.e.,
subsequent triggers are not fired,and the INSERT/UPDATE/DELETE does
not occur for this row).

您需要将其替换为:

RETURN OLD;

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

In the case of a before-trigger on DELETE,the returned value has no
direct effect,but it has to be nonnull to allow the trigger action to
proceed. Note that NEW is null in DELETE triggers,so returning that
is usually not sensible. The usual idiom in DELETE triggers is to
return OLD
.

大胆强调我的.

问题1

我认为你的触发器和触发器功能不应该像AFTER DELETE那样工作.毫无疑问,表工作流中必须存在具有匹配process_id的行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读