Sql 在架构中的所有触发器中搜索单词-oracle
我在运行应用程序时遇到问题-Oracle正在引发Sql 在架构中的所有触发器中搜索单词-oracle,sql,oracle,oracle9i,Sql,Oracle,Oracle9i,我在运行应用程序时遇到问题-Oracle正在引发 ORA-04092: cannot COMMIT in a trigger issue. 现在我试图找到包含commit语句的触发器。是否可以在所有“dba_触发器”中找到包含commit语句的触发器 select * from dba_triggers statement 给我所有的dba触发器。现在,我必须用单词commit搜索这些触发器。如果您得到完整的错误堆栈,您应该能够看到哪个触发器的哪一行抛出了错误。这是最有效的方法。例如,如
ORA-04092: cannot COMMIT in a trigger issue.
现在我试图找到包含commit语句的触发器。是否可以在所有“dba_触发器”中找到包含commit语句的触发器
select * from dba_triggers statement
给我所有的dba触发器。现在,我必须用单词
commit
搜索这些触发器。如果您得到完整的错误堆栈,您应该能够看到哪个触发器的哪一行抛出了错误。这是最有效的方法。例如,如果创建一个提交并运行插入的触发器,堆栈跟踪将显示导致错误的触发器的哪一行
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_源
其中所有者位于()
和上面的(文本),如“%COMMIT%”;
另一方面,失败的触发器很可能正在调用存储过程,而提交的正是存储过程。因此,搜索触发器的来源可能没有好处
通过对
DBA\u依赖项
(或ALL\u依赖项
或USER\u依赖项
进行递归查询,您可能会缓解这种情况,具体取决于您的权限级别和要搜索的范围)查找可能从任何触发器调用的所有过程,并从DBA\u source
搜索所有这些过程的源代码。但这比简单地检查完整的错误堆栈要复杂得多。您可以将触发器导出为PL/SQL,只需搜索文本。感谢您的快速回复Justin Cave。如果可能,您可以提供第二种方法的查询。对不起。我没有完整的数据库知识,因为我是java开发人员。。pls@Satya-这需要我这是一个用于组合和测试第二个查询的代码。您确定不能取而代之的是完整的错误堆栈吗?完整的错误堆栈将立即指出问题所在——即使是第二个查询也可能需要大量的手动工作来分析结果。感谢Justin。这是我得到的错误堆栈跟踪。原因:java.sql.SQLException:ORA-00604:递归sql级别1发生错误ORA-04092:无法在触发器中提交ORA-06512:at第60行,但它不包含过程或触发器(导致此问题)的详细信息..当我试图从java应用程序连接此db时。。非常感谢您的帮助,贾斯汀。@Satya-我发布了一个您得到的堆栈跟踪示例。您是否可以运行SQL*Plus中失败的任何过程来获取完整的堆栈跟踪?