我有一个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();
这种行为是否有任何具体原因?我的代码是否显示任何已知问题的迹象,这些问题将导致触发器不触发?
我发现当今天发生一些插入时,审计列填充为空
2条答案
按热度按时间ryoqjall1#
有很多没有else语句的IF语句可以产生你所讲述的情况。
示例:
1.并且再次相似。
对于调试,您可以考虑一个表,当TRIGGER不执行任何操作时,您可以在其中写入内容。
示例:
1.如果TG_OP ='INSERT',则将"doWork()""else"添加到表"tg_op =值""中。
我不认为数据库不火插入,我认为你是跳过一些如果分支。
toe950272#
我觉得问题不在于扳机没有扣动。
查看触发器代码,您只检查
new.audit_created_date is null
是否为TG_OP = 'INSERT'
。这意味着您可以执行
UPDATE
,将audit_create_date
设置为NULL
;触发器仍将激发,但将new.audit_create_date
设置为current_timestamp
的IF
的第一分支将不执行,因为TG_OP
不等于INSERT
。在这种情况下,
new.audit_create_date
在触发器执行之后仍将是NULL
。