有时候碰巧 AFTER 触发器必须更新它自己的主题表,在极端的情况下,这可以使可用的语句堆变得紧张并增加语句的编译时间。对主题表使用视图和创建 INSTEAD OF 触发器可以允许对主题表进行多次更新,不会引起视图的递归触发。
为使表 UDF 也拥有插入、更新和删除功能,您可能想扩展对表 UDF 的现有读访问权。定义特定于插入、更新和删除的 UDF 是切实可行的。然后您可以在表 UDF 上创建一个视图并定义 INSTEAD OF 触发器以驱动其它 UDF。
这可能类似于上面的外部表示例,但是它具有 WebSphere MQ 函数。
注意事项
我们尝试了许多使用 INSTEAD OF 触发器的示例,但是我们还没有谈到它们的限制。现在让我们来谈一谈。
对称视图由于 INSTEAD OF 触发器上所具有的无法控制的语义,所以您不能在对称视图上创建 INSTEAD OF 触发器。对称视图所接受的行必须可以由该视图返回。此外,不能在拥有 INSTEAD OF 触发器的视图上面创建对称视图。
可更新游标目前在可更新游标的上下文中不支持 INSTEAD OF 触发器。这意味着如果定位更新或定位删除分别造成 INSTEAD OF UPDATE 或 INSTEAD OF DELETE 触发器触发,那么该操作将失败。
警告
触发器的触发顺序INSTEAD OF 触发器被认为是和 AFTER 触发器一起触发的。这意味着如果对 UNION ALL 视图进行更新或删除造成 INSTEAD OF 触发器和/或 AFTER 触发器的触发,那么整组触发器将按照触发器创建时间的先后顺序进行触发。
触发器和约束处理和 AFTER 触发器一样,INSTEAD OF 触发器主体中的 SQL 语句是完整的语义实体。这意味着:举个例子,INSTEAD OF 触发器内的 UPDATE 语句将造成各自的检查约束、RI 约束和触发器在下一个语句之前触发,最终处理转换表中的下一行。
GET_DIAGNOSTICS ROW_COUNT(又名 SQLCA.ERRD(3))在 DB2 V8 之前,通过视图修改的行数始终等于直接在基本表上更新的行数,此处“直接”意味着不包括通过触发器和删除级联 RI 约束修改的行。有了 INSTEAD OF 触发器,这就不再成立了,而且 ROW_COUNT 的含义需要细化。DB2 V8 中的 ROW_COUNT 指定了符合进行用户所给定的更新、删除或插入操作条件的行数。对于进行这类操作的 INSTEAD OF 触发器,这个行数转换成了执行该触发器的次数和转换表的基数。
可能的改进
从 SQL 语言的角度来看,INSTEAD OF 触发器引起了一些有趣的问题和选择。例如:
视图级缺省值由于 INSTEAD OF 触发器将视图查询的语义与其插入、删除和更新行为完全分离,因此仅从底层表派生出的缺省值似乎不再是足够的了。考虑到具有显式列缺省值(甚至可能有标识列特性)的视图似乎比较明智。
语句级 INSTEAD OF 触发器虽然如今 DB2 只支持行级 INSTEAD OF 触发器,但是有各种各样的示例说明语句级 INSTEAD OF 触发器也可能很有用。例如,我们在上面的一个示例中所讨论的异常表触发器如果一次处理一组行而不是每一行,那么肯定会获得更好的性能。
为何视图上只有 INSTEAD OF 触发器?我们已经介绍了视图中的一种触发器,为何就此罢手了呢?BEFORE、AFTER 触发器甚至 IDENTITY 可能是其它值得介绍的触发器。
结束语
在本文中我们讨论了可更新视图的功能和限制。我们介绍了允许您将任何视图转变成可更新视图的 INSTEAD OF 触发器,并发现了用于分布式平台的 DB2 V8 中的这种功能的各种应用。






