Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL触发器不工作-删除之前和之后都不工作_Postgresql_Triggers_Plpgsql - Fatal编程技术网

PostgreSQL触发器不工作-删除之前和之后都不工作

PostgreSQL触发器不工作-删除之前和之后都不工作,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,为了支持PostgreSQL,我刚刚放弃了MySQL,我对触发器有一个问题。此触发器用于在“流程”表中删除行时更新“工作流”表中的字段 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;

为了支持PostgreSQL,我刚刚放弃了MySQL,我对触发器有一个问题。此触发器用于在“流程”表中删除行时更新“工作流”表中的字段

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,PROCESSIONS表将根本不执行删除操作,并传递一个错误:“此行没有唯一标识符”

  • 有人能提供建议吗?

    问题2: 触发器功能以以下内容结束:

    RETURN NULL;
    
    这样,您将跳过触发事件的执行:

    在之前触发的行级触发器可以返回null以通知触发器 经理跳过此行的其余操作(即。, 随后的触发器不会被触发,而
    插入
    /
    更新
    /
    删除
    会被触发 不在此行中出现)

    您需要将其替换为:

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

    如果在
    删除
    上的之前触发,则返回的值没有 直接影响,但它必须非空,以允许触发操作 继续请注意,
    DELETE
    触发器中的
    NEW
    为空,因此返回 这通常是不明智的删除触发器中的惯用用法是 返回
    旧的

    我的

    问题1
    我看不出您的触发器和触发器函数在删除后不能作为
    工作的原因。不用说,表
    工作流
    中必须存在一个具有匹配
    流程id的行

    太好了-谢谢!在MySQL之后,我对触发器返回行为并不十分熟悉。