动态读取oracle触发器中的:NEW对象的列

时间:2015-07-23 14:12:17

标签: oracle triggers

我有一个oracle触发器,需要将更新后的表中的值复制到另一个表中。

问题是在创建触发器时不知道列。该系统的一部分允许应用程序更新表模式。 (不要问)。

基本上我想做的是将表转移到另一个表。

我有一个存储过程可以执行数据透视,但是我无法将其作为触发器的一部分来调用,因为它会对正在更新的表执行select操作。导致"变异"错误。

最理想的是创建一个动态脚本,从更新的表中读取Error: user admin not allowed to access it : grunt-cli npm ERR! at RegClient.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:308:14) npm ERR! at Request._callback (/usr/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:246:65) npm ERR! at Request.self.callback (/usr/lib/node_modules/npm/node_modules/request/request.js:236:22) npm ERR! at Request.emit (events.js:98:17) npm ERR! at Request.<anonymous> (/usr/lib/node_modules/npm/node_modules/request/request.js:1142:14) npm ERR! at Request.emit (events.js:117:20) npm ERR! at IncomingMessage.<anonymous> (/usr/lib/node_modules/npm/node_modules/request/request.js:1096:12) npm ERR! at IncomingMessage.emit (events.js:117:20) npm ERR! at _stream_readable.js:944:16 npm ERR! at process._tickCallback (node.js:448:13) npm ERR! If you need help, you may report this *entire* log, npm ERR! including the npm and node versions, at: npm ERR! <http://github.com/npm/npm/issues> npm ERR! System Linux 2.6.32-504.el6.x86_64 npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "-g" "grunt-cli" npm ERR! cwd /root npm ERR! node -v v0.10.40 npm ERR! npm -v 1.4.28 npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /root/npm-debug.log npm ERR! not ok code 0 的所有列名,并从user_tab_cols对象中读取值。

但当然......我不能......

:new在动态脚本执行时不存在。所以像下面这样的东西会失败:

:NEW

所以,我被困了。

我无法从已更新的表格中读取,但我无法读取从EXECUTE IMMEDIATE `insert into pivotTable values(:NEW.' || variableWithColumnName ||')'; 对象更新的值。

除了每次更改架构时重建触发器之外,还有其它方法可以实现吗?

1 个答案:

答案 0 :(得分:2)

没有。每当表格发生变化时,您都需要重建触发器。

如果您想真正参与进来,可以通过阅读CREATE OR REPLACE编写一个动态生成DDL到user_tab_columns触发器的过程。然后,您可以创建一个在更改表时触发的DDL触发器,通过调用重新创建触发器的过程的dbms_job提交作业。这是有效的,但它是一个相当大的移动部件,这意味着它可以以各种微妙和壮观的方式失败,特别是如果正在进行架构更改的应用程序决定在一天中间添加列