通过使用“FOR UPDATE” - 光标的替代触发器更新不可更新视图

时间:2014-11-30 19:51:42

标签: sql oracle plsql oracle12c

问题的上下文:我正在努力捕获对表的所有更改,以及仅将某些行暴露给选择数据的任何过程或游标。为此,我从另一个模式中的表定义创建表(让我们称之为模式A),并在此模式中创建一个视图,该视图公开来自模式A中新创建的表的数据,以及模式B中的原始表。 (使用UNION)

Simplified design

此处未显示但还包括能够“打开/关闭”模式A或B中的表,以及限制模式A中的可见数据到全局上下文变量。在替代触发器中,捕获DML,并在记录表中记录任何更改。

处理数据的实际功能或程序已经到位,我无法对其进行修改。这些函数旨在直接访问模式B中的表。

此设置运行良好,我能够以我想要的方式捕获所有数据更改。但是仍有一个问题。每当过程包含带有FOR UPDATE选项的游标时,该过程将失败并显示ORA-02014: Cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.

由于UNION构造,视图不是可更新的视图。但是,我可以通过反向触发来捕获所有其他更新。

实际问题:即使使用FOR UPDATE游标,有没有办法让这个设计(VIEW)工作?也许我可以自己提供ROWID或以某种方式欺骗光标?

(注意,视图中的UNION实际上并不合并2个表的数据集,因为它切换到模式A或B中的任一个表,两个SELECT ... FROM [A.table] UNION SELECT ... FROM [B.Table]中的一个将始终返回0行。 )

0 个答案:

没有答案