我有一个错误:'ORA-04092:在更新触发器后尝试在一个简单的oracle中执行ddl命令时,无法在触发器中执行'。触发器需要在更新列中的一个字段后创建公共数据库链接。这是来源:
create or replace
TRIGGER CreateLinkTrigger
after UPDATE of Year ON tableInit
for each row
DECLARE
add_link VARCHAR2(200);
BEGIN
IF :new.year = '2014'
then
add_link := q'{create public database link p2014 connect to test14 identified by temp using 'ora'}';
execute immediate add_link;
END IF;
END;
因此,您可以看到我需要在激活新年后创建新的公共数据库链接。 因此,当我尝试使用年份值'2014'更新表'tableInit'时,我得到ORA-04092错误。 有没有办法避免这个错误,或另一种解决方案? 感谢...
答案 0 :(得分:2)
动态创建数据库链接似乎是一件不寻常的事情;您的架构通常应该是静态且稳定的。但是,如果必须的话,将更新和链接包装在一个过程中会更简单,或者只发出两个语句 - 无论如何,无论如何执行更新都会受到相当的控制,否则你必须处理触发这个多重的多个人时间,这将更加混乱。
您可以通过向触发器添加PRAGMA autonomous_transaction;
来实现此功能,如针对类似问题所示(创建视图而非链接)in this answer,但我不能现在测试一下。
create or replace
TRIGGER CreateLinkTrigger
after UPDATE of Year ON tableInit
for each row
DECLARE
add_link VARCHAR2(200);
PRAGMA autonomous_transaction;
BEGIN
...
您还可以让触发器提交异步作业来执行DDL,如in this answer所述,还有一个示例in this answer,您可以在其中更改作业的匿名块以执行execute immediate
。
在维护窗口期间或按计划或从程序中提前创建未来几年的链接可能会更好;而不是尝试将架构更改与数据更改相关联。