我有一个表,在其他列中,有4列用于存储:
created_tm
)created_by
)last_updated
)updated_by
)每当发生更新语句时,我都创建了一个触发器来填充last_updated
和updated_by
:
create trigger my_table_audit update on my_table referencing old as pre new as post
for each row
(
update my_table set last_updated = CURRENT year to second,
updated_by = USER where (id = pre.id)
);
但是,当我更新特定行的普通列时,更新失败并显示:
[Code: -747, SQL State: IX000] Table or column matches object
referenced in triggering statement.
有没有办法解决这个问题,而不必明确地命名应该触发的表的所有单个列?
答案 0 :(得分:2)
在Informix中,操纵定义它们的表的触发器受到几个限制。该列表非常广泛,因此我只链接在线文档(版本12.10):
在您的情况下,可能的解决方案是使用触发器过程来操纵插入/更新的值,如ceinmart在Informix trigger to change inserted values的答案中所解释的那样。
所以使用触发程序,它将是这样的:
CREATE TABLE self_audit
(
id SERIAL PRIMARY KEY CONSTRAINT pk_self_audit
, col1 CHAR(3)
, created_tm DATETIME YEAR TO FRACTION
, created_by CHAR(10)
, last_updated DATETIME YEAR TO FRACTION
, updated_by CHAR(10)
);
CREATE PROCEDURE spti_self_audit ()
REFERENCING NEW AS new_insert FOR self_audit;
LET new_insert.created_tm = CURRENT;
LET new_insert.created_by = USER;
LET new_insert.last_updated = CURRENT;
LET new_insert.updated_by = USER;
END PROCEDURE;
CREATE TRIGGER ti_self_audit INSERT ON self_audit
REFERENCING NEW AS new_insert
FOR EACH ROW
(
EXECUTE PROCEDURE spti_self_audit() WITH TRIGGER REFERENCES
);
CREATE PROCEDURE sptu_self_audit ()
REFERENCING NEW AS post OLD AS pre FOR self_audit;
LET post.last_updated = CURRENT;
LET post.updated_by = USER;
END PROCEDURE;
CREATE TRIGGER tu_self_audit UPDATE ON self_audit
REFERENCING NEW AS post OLD AS pre
FOR EACH ROW
(
EXECUTE PROCEDURE sptu_self_audit() WITH TRIGGER REFERENCES
);
我对这种类型的触发器例程的理解是,我们直接操作将要插入/更新的值,而不是通过触发器操作进行更多的更新/插入。
在这种情况下,我的更新触发器仅操纵列last_updated
和updated_by
的值,因此用户可以更改列created_tm
和created_by
的值