问题的上下文:我正在努力捕获对表的所有更改,以及仅将某些行暴露给选择数据的任何过程或游标。为此,我从另一个模式中的表定义创建表(让我们称之为模式A),并在此模式中创建一个视图,该视图公开来自模式A中新创建的表的数据,以及模式B中的原始表。 (使用UNION)
此处未显示但还包括能够“打开/关闭”模式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行。 )