在模式中搜索所有触发器中的单词 - oracle

时间:2011-09-21 22:28:25

标签: sql oracle oracle9i

我在运行应用程序时遇到问题 - Oracle正在提出

ORA-04092: cannot COMMIT in a trigger issue.

现在我正在尝试查找包含commit语句的触发器。是否有可能在所有`dba_triggers'中找到具有commit语句的触发器?

select * from dba_triggers statement  

给了我所有的dba触发器。现在,我必须使用单词commit搜索这些触发器。

1 个答案:

答案 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_DEPENDENCIESUSER_DEPENDENCIES上执行递归查询,具体取决于您的权限级别和要搜索的范围)来查找所有可能从任何触发器调用的过程,并从DBA_SOURCE搜索所有这些过程的源。但这比仅仅检查完整的错误堆栈要复杂得多。