如何在Informix中解决错误代码-747?

时间:2017-08-09 00:58:29

标签: sql informix

我有一个表,在其他列中,有4列用于存储:

  • 插入行时(created_tm
  • 已插入行(created_by
  • 更新行时(last_updated
  • 谁更新了行(updated_by

每当发生更新语句时,我都创建了一个触发器来填充last_updatedupdated_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.

有没有办法解决这个问题,而不必明确地命名应该触发的表的所有单个列?

1 个答案:

答案 0 :(得分:2)

在Informix中,操纵定义它们的表的触发器受到几个限制。该列表非常广泛,因此我只链接在线文档(版本12.10):

在您的情况下,可能的解决方案是使用触发器过程来操纵插入/更新的值,如ceinmartInformix 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_updatedupdated_by的值,因此用户可以更改列created_tmcreated_by的值