Oracle的示例“而不是”触发器

时间:2009-09-02 23:03:17

标签: oracle plsql

有没有人有一个简单的例子来解释为什么人们想要使用Oracle instead of trigger

4 个答案:

答案 0 :(得分:8)

我见过几种不同的情景

1)您使用初始数据模型构建系统,并为要查询的应用程序提供一组视图,这些视图与表的映射只有1:1。将来,如果您决定需要更改数据模型并将一个表分成两个不同的表,则可以通过保持视图层不变来影响任何现有应用程序。但是为了使应用程序保持透明,您必须继续允许视图上的插入导致插入两个(或更多)不同的表,您需要一个INSTEAD OF触发器。

2)#1的变体,你的应用程序开始只是直接击中表。如果要在不影响现有应用程序的情况下重构表定义,则重命名表(T变为T_OLD),创建新表,并使用INSTEAD OF触发器创建名为T的视图。这具有相同的效果 - 它允许您更改表声明而无需更改应用程序。

答案 1 :(得分:4)

贾斯汀有nailed the two main cases但还有其他一些用途。

其中一个是表格包含其数据的历史记录以及当前版本。在这里,我们希望构建一个基于表的视图(例如控制显示哪个版本),使用INSTEAD OF UPDATE触发器将当前记录更新为旧,然后将更改作为插入应用,创建新的当前记录。这个主题有不同的变化;例如,我们可以通过使用INSTEAD OF DELETE触发器来执行更新(设置DELETED_FLAG列)来实现逻辑删除策略。

另一种情况是应用程序要求我们维护一些数据的两个副本 - 主表和本地表。我们将使用可更新的视图从适当的表和INSTEAD OF触发器中进行选择,以决定将DML应用于哪个表。

这些并不是如何设计一个好的,健全的数据模型的光荣例子。但它们是我们偶尔发现自己必须实施的各种克拉格。

答案 2 :(得分:2)

docs表示他们要修改视图。

因此,如果您创建的视图是两个表的JOIN,并且您尝试在VIEW上执行INSERT语句,则可以编写一个INSTEAD OF触发器,它会相应地修改两个基础表。

答案 3 :(得分:2)

我见过的另一个非常成功的模型是应用程序架构想要将数据库设计与前端隔离开来。他们希望在数据库方面做到这一点,而不是通过对象关系框架。

例如,如果您想使前端开发人员的工作变得非常简单,您可以为每个前端页面(或一组页面)构建一个视图。然后使用替代触发器来处理映射回基础表。

当然,拥有了解Oracle工作原理的可靠数据库开发人员会很有帮助。