Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle更新后触发器创建公共数据库链接_Oracle_Plsql_Triggers_Ddl_Database Link - Fatal编程技术网

Oracle更新后触发器创建公共数据库链接

Oracle更新后触发器创建公共数据库链接,oracle,plsql,triggers,ddl,database-link,Oracle,Plsql,Triggers,Ddl,Database Link,我在更新触发器后尝试在一个简单的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

我在更新触发器后尝试在一个简单的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错误。 有没有办法避免这个错误,或者有其他解决办法?
谢谢…

动态创建数据库链接似乎是一件不同寻常的事情;您的模式通常应该是静态和稳定的。然而,如果您必须这样做,那么将更新和链接包装在一个过程中,或者只发出两条语句就更简单了——不管执行更新的是什么,都应该受到相当的控制,否则您必须处理多次触发此操作的多人,这将更加混乱

您可以通过添加
PRAGMA autonomy\u事务来实现这一点到您的触发器,正如针对类似问题(创建视图而不是链接)所演示的那样,但我目前无法测试这一点

create or replace
TRIGGER CreateLinkTrigger
after UPDATE of Year ON tableInit 
for each row
DECLARE
    add_link VARCHAR2(200);
    PRAGMA autonomous_transaction;
BEGIN
    ...
您还可以让触发器提交一个异步作业来执行DDL,如前所述,还有更多的示例,您可以更改作业的匿名块来执行
立即执行


最好是在维护窗口期间,或按照时间表,或根据程序,提前几年创建链接;与其尝试将架构更改与数据更改关联起来。

为什么要在触发器内首先创建DBLINK?。因为在新年前夕,当我的客户在应用程序中完成所有交易时,我有新的州法律,其中包括新的税收和许多其他更改,将在2014年1月1日00:00生效,所以我需要快速地将它们重定向到一个新的模式,该模式已经定义了新的法律和税收:/。问题是有20多个客户需要这个,所以在新年前夕一个接一个地改变税收和其他所有申请,对我来说不是一个选择…:)那么,您不能安排在那个时候运行一个作业来创建链接吗?是什么导致您试图触发链接创建的表更新?这也是在固定时间发生的,还是作为流程的一部分而不是依赖触发器启动链接更改的过程的一部分?e、 g.程序中的更新和动态创建?(此外,如果新模式位于同一数据库中,那么同义词比链接更合适;但即使是单独的模式也似乎是一种奇怪的设计)。表不会在固定时间更新,但有一个程序由我的客户在2013年12月31日完成工作时使用的按钮触发。该程序使用2014更新年份列,并导致tableInit更新为“2014”。因此,我需要创建一个指向新模式的新链接,并定义新的税和所有内容,以便我的客户机可以使用该模式提供的新数据。新架构不总是在同一数据库中…:/那么,为什么不在相同的过程中创建链接,而不是尝试使用触发器来完成一些复杂的操作呢?我能看到的唯一缺点是DDL仍然会发出一个隐式提交,这在您的过程中可能不需要;但是如果这是一个问题,那么您的过程可以提交一个作业来异步执行吗?谢谢Alex,在我添加了PRAGMA autonomy_transaction;,触发器现在可以工作了@伊万塔迪奇——也许你也应该投票……我会的,亚历克斯,一旦我获得15岁的声誉,我仍然无法投票……;)