我有一个奇怪的场景。我试着看看我是否能找到关于这个主题的任何帮助,但我要么不知道如何正确搜索它,要么就找不到任何东西。
所以这是场景。
我有一张表A.从表T_A,我创建了一个视图V_B。现在,我可以向V_B进行更新,它运行正常。然后,当我创建一个视图V_C,它是T_A和T_D的UNION时,视图V_C是不可更新的。我理解为什么会这样的逻辑。
但我的问题是,在我合并2个表并且能够更新的地方,我能做些什么吗?
也许某种方式让表T_D扩展T_A?
一些额外的信息:T_A有1-10项,T_D有100 - 200项。我想加入它们,所以有一个可更新的表/视图,它有1-10和100-200项。
答案 0 :(得分:2)
如果您有一个不可更新的视图,您可以通过在视图上定义instead of triggers来使其可更新。这意味着您需要实现逻辑以确定如何针对一个或两个基表将DML针对视图转换为DML。在你的情况下,听起来似乎是找出要更新的两个表中哪一个的逻辑。
但有几点。
T_A
和T_D
的数据不重叠,则使用隐式UNION
的{{1}}是没有意义的。你几乎肯定想要使用较便宜的DISTINCT
。 UNION ALL
这两个表存储在一起,则很可能存在基础数据模型问题。如果一个项目表可能UNION ALL
ITEM_TYPE
或A
,那么似乎更有意义。D
并拥有(或添加)非重叠约束,您可以将视图更改为partition view,则可以使您的视图可更新。这是Oracle长期以来存在的一些东西,但是在最近的版本中你没有找到关于它的大量文档,因为Oracle分区对于今天的绝大多数用例来说是一个更好的解决方案。但旧的7.3.4文档仍应有效。