【发布时间】: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