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

在oracle触发器中动态读取:新对象的列,oracle,triggers,Oracle,Triggers,我有一个oracle触发器,需要将值从更新的表复制到另一个表 问题是在创建触发器时不知道列。此系统的一部分允许应用程序更新表架构。(不要问) 基本上,我想做的是将表透视到另一个表 我有一个存储过程来执行透视,但我不能将其作为触发器的一部分调用,因为它对正在更新的表进行选择。导致“变异”错误 理想的做法是创建一个动态脚本,从更新的表的用户选项卡中读取所有列名,并从:new对象中读取值 但当然……我不能:) :执行动态脚本时不存在新的。因此,类似以下内容的操作将失败: EXECUTE IMMEDIA

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

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

基本上,我想做的是将表透视到另一个表

我有一个存储过程来执行透视,但我不能将其作为触发器的一部分调用,因为它对正在更新的表进行选择。导致“变异”错误

理想的做法是创建一个动态脚本,从更新的表的
用户选项卡中读取所有列名,并从
:new
对象中读取值

但当然……我不能:)

:执行动态脚本时不存在新的
。因此,类似以下内容的操作将失败:

EXECUTE IMMEDIATE `insert into pivotTable values(:NEW.' || variableWithColumnName ||')';
所以,我被卡住了

我无法读取更新的表,也无法读取从
:NEW
对象更新的值


除了在每次架构更改时重新生成触发器外,是否还有其他方法可以完成此操作?

否。每当表更改时,您都需要重新生成触发器


如果您想真正参与进来,可以编写一个过程,通过读取
user\u tab\u columns
动态生成DDL来创建或替换触发器。然后,您可以创建一个DDL触发器,该触发器在表被更改时触发,并通过调用过程重新创建触发器的
dbms_job
提交一个作业。这是可行的,但它是一个相当大的活动部分,这意味着它可以在各种微妙和惊人的方式失败,特别是如果正在进行模式改变的应用程序决定在一天中添加列。

可以使用Oracle流并捕获LCRs(逻辑更改记录),但这需要大量的工作和开销。我倾向于重建触发器,这似乎比它的价值要麻烦得多。幸运的是,我们有一个元数据表,我们可以添加一个触发器来监视另一个表架构中的更改。