在 Oracle 触发器中动态评估伪记录 (:OLD, :NEW)
Dynamically Evaluate Pseudo Records (:OLD, :NEW) in Oracle Trigger
问题: 我有一个 table 客户可以向其中添加列。这个 table 可能有数百列不同的数据类型,具体取决于客户的疯狂程度。我需要针对此 table 部署一个 AFTER UPDATE 触发器,以便在另一个 table 中为具有 已更改 .
的每个列值插入一行
示例:
- Table_A,第 1 行:Key_Value=1,Col1=123,Col2="foo"...Coln="bar"
- 变成
- Table_B,第 1 行:Key_Value=1,ColName="Col1",ColValue=123
- Table_B,第 2 行:Key_Value=1,ColName="Col2",ColValue="foo"
- Table_B,第 3 行:Key_Value=1,ColName="Coln",ColValue="bar"
由于我不知道他们可能会创建哪些列并且此触发器必须与应用程序一起部署,我需要动态评估 OLD 与 NEW 伪记录 (if :new.columns[1] != :old.columns[1] then...
) 以查看发生了什么变化并记录只有更改的列。我能够找到的唯一示例需要显式引用伪记录中的列 (if :new.col1 != :old.col1 then...
)。
问题:在 Oracle 中有没有办法做到这一点?
警告: 不,这不是用于审计目的,所以我不能使用 Oracle 的内置审计。不,我们不会重写我们的应用程序,因为您知道如何做得更好,无论好坏,这都是它需要工作的方式。
欢迎任何有用的评论。所有的 DBA 胡言乱语都不是。提前致谢。
没有。您不能动态引用 :new
或 :old
伪记录中的列。
最接近的可能是编写代码,通过查询数据字典并静态引用伪记录中的列来动态生成整个触发器主体。但是,每次从 table 添加或删除列时,该代码都需要 运行。通常,这将作为正常发布管理的一部分来完成。如果您是说人们在不经过发布过程的情况下从这个 table 添加和删除列,您可以编写一个 DDL 触发器,通过 dbms_job
提交一个调用重建触发器的过程的作业。这将是很多动人的部分,当不可避免地出现问题时进行故障排除会很痛苦,但如果您不接受实现该功能的其他方法,那么您将不得不忍受这种复杂性。
问题: 我有一个 table 客户可以向其中添加列。这个 table 可能有数百列不同的数据类型,具体取决于客户的疯狂程度。我需要针对此 table 部署一个 AFTER UPDATE 触发器,以便在另一个 table 中为具有 已更改 .
的每个列值插入一行示例:
- Table_A,第 1 行:Key_Value=1,Col1=123,Col2="foo"...Coln="bar"
- 变成
- Table_B,第 1 行:Key_Value=1,ColName="Col1",ColValue=123
- Table_B,第 2 行:Key_Value=1,ColName="Col2",ColValue="foo"
- Table_B,第 3 行:Key_Value=1,ColName="Coln",ColValue="bar"
由于我不知道他们可能会创建哪些列并且此触发器必须与应用程序一起部署,我需要动态评估 OLD 与 NEW 伪记录 (if :new.columns[1] != :old.columns[1] then...
) 以查看发生了什么变化并记录只有更改的列。我能够找到的唯一示例需要显式引用伪记录中的列 (if :new.col1 != :old.col1 then...
)。
问题:在 Oracle 中有没有办法做到这一点?
警告: 不,这不是用于审计目的,所以我不能使用 Oracle 的内置审计。不,我们不会重写我们的应用程序,因为您知道如何做得更好,无论好坏,这都是它需要工作的方式。
欢迎任何有用的评论。所有的 DBA 胡言乱语都不是。提前致谢。
没有。您不能动态引用 :new
或 :old
伪记录中的列。
最接近的可能是编写代码,通过查询数据字典并静态引用伪记录中的列来动态生成整个触发器主体。但是,每次从 table 添加或删除列时,该代码都需要 运行。通常,这将作为正常发布管理的一部分来完成。如果您是说人们在不经过发布过程的情况下从这个 table 添加和删除列,您可以编写一个 DDL 触发器,通过 dbms_job
提交一个调用重建触发器的过程的作业。这将是很多动人的部分,当不可避免地出现问题时进行故障排除会很痛苦,但如果您不接受实现该功能的其他方法,那么您将不得不忍受这种复杂性。