问题描述
嗨,汤姆。当我尝试通过使用ddl触发器创建dml触发器时,存在一些问题
DNS。ddl触发器如下所示:
但是发生了一些问题。有人告诉我 “尝试锁定对象时检测到ORA-04020死锁...”,我没有
知道如何修复它。我是Oracle和PL/SQL编程的绿手。我想做的就是创造
创建表时,ddl触发器会自动触发dml。非常感谢您抽出时间阅读
我的问题。
DNS。ddl触发器如下所示:
create or replace trigger auto_create_dml_trigger after create on database declare pragma autonomous_transaction; create_sql varchar2(2000); begin create_sql := generate_trigger_exp( ); --comment: generate_trigger_exp() is a --procedure used to generate an expression that creates a trigger. I assure you I can --succussfully get the whole expression. For example, i create a table table_a, then --auto_create_dml_trigger got fired, and create_sql will get the value 'create or replace --trigger syn_update after update on table_a ......' by generate_trigger_exp(). execute immediate create_sql; commit; end;
但是发生了一些问题。有人告诉我 “尝试锁定对象时检测到ORA-04020死锁...”,我没有
知道如何修复它。我是Oracle和PL/SQL编程的绿手。我想做的就是创造
创建表时,ddl触发器会自动触发dml。非常感谢您抽出时间阅读
我的问题。
专家解答
所以你有一个运行更多DDL的DDL触发器。所以这将会发生:
创建表会触发DDL触发器。
它创建了一个触发器
再次触发DDL触发器
它试图再次创建触发器
再次触发DDL触发器
它试图再次创建触发器!
等。
看到问题了吗?
根据generate_trigger_exp的工作方式,它可能正在尝试重新创建相同的触发器。它会被卡住的!
我会避免尝试自动生成这样的触发器。如果你需要一个触发器代码它显式
或查看是否有现有功能可以执行您在触发器中计划的操作。例如,自动递增列的标识列/序列默认值。
创建表会触发DDL触发器。
它创建了一个触发器
再次触发DDL触发器
它试图再次创建触发器
再次触发DDL触发器
它试图再次创建触发器!
等。
看到问题了吗?
根据generate_trigger_exp的工作方式,它可能正在尝试重新创建相同的触发器。它会被卡住的!
我会避免尝试自动生成这样的触发器。如果你需要一个触发器代码它显式
或查看是否有现有功能可以执行您在触发器中计划的操作。例如,自动递增列的标识列/序列默认值。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




