Postgresql:触发器有时不工作

ccrfmcuu  于 2023-02-08  发布在  PostgreSQL
关注(0)|答案(2)|浏览(308)

我有一个PostgreSQL触发器有时不会触发,尽管状态总是显示为“已启用”。
我的触发代码如下:

CREATE OR REPLACE FUNCTION audit_src_exhibit() RETURNS trigger AS $BODY$
BEGIN
  IF TG_OP = 'INSERT' then
        if new.audit_created_date is null  THEN
        new.audit_created_date := current_timestamp;
        new.audit_created_by := session_user::text;
    end if;
    else
        if new.audit_modified_date is null  THEN
        new.audit_modified_date := current_timestamp;
        new.audit_modified_by := session_user::text;
    end if;
END IF;
  RETURN NEW;
END; $BODY$ LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER audit_src_exhibit_tr
BEFORE INSERT OR UPDATE ON <table>
FOR EACH ROW EXECUTE PROCEDURE audit_src_exhibit();

这种行为是否有任何具体原因?我的代码是否显示任何已知问题的迹象,这些问题将导致触发器不触发?
我发现当今天发生一些插入时,审计列填充为空

ryoqjall

ryoqjall1#

有很多没有else语句的IF语句可以产生你所讲述的情况。
示例:

  1. TG_OP始终为INSERT?或可以为"Insert"?(区分大小写问题)
  2. IF "新的.审计创建日期为空"..否则???
    1.并且再次相似。
    对于调试,您可以考虑一个表,当TRIGGER不执行任何操作时,您可以在其中写入内容。
    示例:
    1.如果TG_OP ='INSERT',则将"doWork()""else"添加到表"tg_op =值""中。
    我不认为数据库不火插入,我认为你是跳过一些如果分支。
toe95027

toe950272#

我觉得问题不在于扳机没有扣动。
查看触发器代码,您只检查new.audit_created_date is null是否为TG_OP = 'INSERT'
这意味着您可以执行UPDATE,将audit_create_date设置为NULL;触发器仍将激发,但将new.audit_create_date设置为current_timestampIF的第一分支将不执行,因为TG_OP不等于INSERT
在这种情况下,new.audit_create_date在触发器执行之后仍将是NULL

相关问题