我有一个错误:“ 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错误。有什么办法可以避免此错误,或者对此有其他解决方案?谢谢...
快速创建数据库链接似乎是一件不寻常的事情。您的架构通常应该是静态且稳定的。但是,如果必须的话,将更新和链接包装在一个过程中或者只发出两个语句会更简单-大概执行更新的任何操作都受到了合理的控制,否则您将不得不处理触发此多次更新的多个人时代,那会更是一团糟。
您可能可以通过添加PRAGMA autonomous_transaction;
触发器来完成此工作,如此答案中针对类似问题(创建视图而不是链接)所演示的那样,但是目前我无法对此进行测试。
create or replace
TRIGGER CreateLinkTrigger
after UPDATE of Year ON tableInit
for each row
DECLARE
add_link VARCHAR2(200);
PRAGMA autonomous_transaction;
BEGIN
...
你也可以将触发提交异步作业的执行DDL,如所描述的这个答案,而且还有更多的例子在这个答案,在这里你会改变作业的匿名块做你的execute immediate
。
最好在维护时段内,按时间表或从过程中提前创建未来几年的链接。而不是尝试将架构更改与数据更改相关联。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句