0

更新触发器后尝试在一个简单的 oracle 中执行 ddl 命令时出现错误:“ORA-04092:无法在触发器中提交”。更新列中的一个字段后,触发器需要创建公共数据库链接。这是来源:

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 错误。有什么办法可以避免这个错误,或者有其他解决方案吗?谢谢...

4

1 回答 1

2

动态创建数据库链接似乎是一件不寻常的事情。您的架构通常应该是静态且稳定的。但是,如果必须,将更新和链接包装在一个过程中会更简单,或者只发出两个语句 - 大概无论如何执行更新都是相当受控的,否则您必须处理多个触发此多个的人次,这将更加混乱。

您可以通过添加到您的触发器来完成这项工作,如this answerPRAGMA 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

在维护窗口期间、按计划或从程序中提前创建未来几年的链接可能会更好;而不是试图将架构更改与数据更改相关联。

于 2013-12-11T11:45:37.830 回答