暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何在ddl触发器中创建dml触发器

ASKTOM 2020-05-11
249

问题描述

嗨,汤姆。当我尝试通过使用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的工作方式,它可能正在尝试重新创建相同的触发器。它会被卡住的!

我会避免尝试自动生成这样的触发器。如果你需要一个触发器代码它显式

或查看是否有现有功能可以执行您在触发器中计划的操作。例如,自动递增列的标识列/序列默认值。

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论