【发布时间】:2017-10-06 12:58:46
【问题描述】:
出于测试目的,我希望自动化以下场景:
将我的表的 Status 列设置为 closed 值(使用更新语句)
提交更新,以便其他用户可以看到 Status
的新值
等待 1 分钟
将我的表的Status列重置为其原始值init(使用触发器)
提交更新,以便其他用户可以看到 Status
的原始值
我试过使用这个触发器,但它不起作用,我得到了
ORA-04091: 表名发生变化,触发器/函数可能看不到它
CREATE OR REPLACE TRIGGER RESET_COLUMN
AFTER UPDATE OF STATUS ON MY_TABLE
FOR EACH ROW
WHEN (NEW.STATUS != 'INIT')
BEGIN
DBMS_LOCK.SLEEP(60);
UPDATE MY_TABLE SET STATUS = 'INIT';
COMMIT;
END;
/
既然不允许在触发器内提交,有没有其他方法可以解决这个问题?使用基于事件的作业?
【问题讨论】:
-
:new.status := 'INIT';并从触发器中删除commit。您不能在触发器内进行任何事务处理 -
但是我需要提交这些事务,以便其他用户可以使用它们。请查看已编辑的问题
标签: sql oracle plsql triggers oracle12c