我在运行应用程序时遇到问题 - Oracle正在提出
ORA-04092: cannot COMMIT in a trigger issue.
现在我正在尝试查找包含commit语句的触发器。是否有可能在所有`dba_triggers'中找到具有commit语句的触发器?
select * from dba_triggers statement
给了我所有的dba触发器。现在,我必须使用单词commit
搜索这些触发器。
答案 0 :(得分:2)
如果你得到完整的错误堆栈,你应该能够看到什么触发器引发了错误。这是最有效的方法。例如,如果您创建一个提交并运行INSERT的触发器,则堆栈跟踪将显示导致错误的触发器的哪一行。
SQL> create table t (
2 col1 number
3 );
Table created.
SQL> ed
Wrote file afiedt.buf
1 create trigger trg_t
2 before insert on t
3 for each row
4 begin
5 commit;
6* end;
SQL> /
Trigger created.
SQL> begin
2 insert into t values( 1 );
3 end;
4 /
begin
*
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SCOTT.TRG_T", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG_T'
ORA-06512: at line 2
您可以在源中搜索查找特定字符串的所有触发器。像这样的东西会在你指定的任何模式中的任何触发器中查找文字“COMMIT”。
SELECT name, text, line
FROM dba_source
WHERE owner IN (<<schemas you want to search>>)
AND upper(text) like '%COMMIT%';
另一方面,失败的触发器很可能正在调用存储过程,并且它是正在提交的存储过程。因此,搜索触发器的来源可能没有用处。
您可以通过在DBA_DEPENDENCIES
(或ALL_DEPENDENCIES
或USER_DEPENDENCIES
上执行递归查询,具体取决于您的权限级别和要搜索的范围)来查找所有可能从任何触发器调用的过程,并从DBA_SOURCE
搜索所有这些过程的源。但这比仅仅检查完整的错误堆栈要复杂得多。