【问题标题】:Oracle after update trigger creating public database linkOracle 更新后触发创建公共数据库链接
【发布时间】:2013-12-29 08:18:57
【问题描述】:

在更新触发器后尝试在一个简单的 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 错误。 有什么办法可以避免这个错误,或者有其他解决方案吗? 谢谢...

【问题讨论】:

  • 为什么要先在Trigger里面创建DBLINK?
  • 因为在新年前夜,当我的客户在申请中完成所有交易时,我有新的州法律,新的税收和许多其他变化将于 2014 年 1 月 1 日 00:00 生效,所以我需要将他们快速重定向到一个新模式,该模式已经在那个时间准确地定义了新的法律和税收:/。问题是有超过 20 个客户需要这个,所以改变税收和申请中的所有其他东西,在新年前夜一个一个客户对我来说不是一个选择...... :)
  • 那么您不能安排一个在那个时候运行的作业来创建链接吗?是什么导致您尝试触发链接创建的表更新 - 这也是在固定时间发生的,还是作为可以启动链接更改作为其流程的一部分而不是依赖触发器的过程的一部分?例如在程序中更新和动态创建? (另外,如果新模式在同一个数据库中,那么同义词会比链接更合适;但即使是单独的模式似乎也是一种奇怪的设计)。
  • 表格不会在固定时间更新,但是我的客户在 2013 年 12 月 31 日完成工作时使用的按钮触发了一个过程。该过程正在使用 2014 更新年​​份列,这会导致 tableInit 更新为“2014”。因此,我需要创建一个指向新模式的新链接,其中包含新税和所有定义的内容,以便我的客户可以使用该模式提供的新数据。新模式并不总是在同一个数据库中...:/
  • 那么为什么不在同一个过程中创建链接,而不是尝试用触发器做一些复杂的事情呢?我能看到的唯一缺点是 DDL 仍会发出隐式提交,您可能不希望在您的过程中这样做;但如果这是一个问题,您的程序可以提交一个作业来异步执行它吗?

标签: oracle plsql triggers ddl database-link


【解决方案1】:

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

您可以通过将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

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

【讨论】:

  • 谢谢亚历克斯,在我添加 PRAGMA 自治事务后,触发器现在正在工作; !
  • @IvanTadic - 也许你也应该投票给answer I nicked that idea from...
  • 我会选择 Alex,一旦我获得 15 的声誉,我仍然无法投票... ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2018-02-05
相关资源
最近更新 更多