日期:2014-05-16  浏览次数:20433 次

《Oracle Database 11g PL/SQL程序设计》触发器介绍

数据库触发器是特殊的存储程序。通常不直接调用它们,而要由数据库中的事件触发。它们在执行命令时和执行数据库管理系统动作之间运行。触发器可以用PL/SQL或Java编写。触发器可以捕获创建、修改或删除对象的事件,也可以捕获表或视图中的插入、更新或删除操作。它们还可以监控数据库或模式的状态变化及用户动作的变化。

本章包括如下主题:

●???????触发器简介

●???????触发器体系结构

●???????数据定义语言触发器

●???????数据操作语言触发器

●???????复合触发器

●???????instead-of触发器

●???????系统或数据库事件触发器

●???????触发器限制

这些部分首先介绍基础知识,然后提出一些思想。如果想马上开始编写具体类型的触发器,也可以将它们作为快速参考。例如,可以翻到本章10.4节了解如何编写插入、更新和删除的触发器。

?

?

10.1??触发器简介

?

数据库触发器是特殊的存储程序。因此,它们的定义与DDL规则非常相似。同样,触发器可以调用SQL语句和PL/SQL函数与过程。可以选择用PL/SQL或Java实现触发器。可以参见第14章和附录D了解编写Java库支持触发器的语法。

数据库触发器不同于存储函数和过程,因为不能直接调用它们。当数据库中发生触发事件时会激发数据库触发器。所以它们是管理数据库的有力工具。可以通过触发器来限制或重定向程序的行为。

触发器的用途有:

●???????控制DDL语句的行为,如通过更改、创建或重命名对象

?????????(DDL :数据定义语言及翻译程序)

●???????控制DML语句的行为,如插入、更新和删除

?????????(DML :数据操纵语言及编译(解释)程序)

●???????实施参照完整性、复杂业务规则和安全性策略

●???????在修改视图中的数据时控制和重定向DML语句

●???????通过创建透明日志来审核系统访问和行为的信息

另一方面,由于不能控制对触发器的同步调用序列,所以如果过分依赖触发器的话,这可能成为问题。您唯一能控制的是让它们在某个事件之前还是之后触发。Oracle 11g提供了复合触发器来辅助管理较大的事件,比如需要排序的触发器事件。

使用触发器有一定的风险。风险比较复杂,因为当SQL语句激发触发器时,触发器会调用SQL语句。一个触发器可能调用一个会激发另一个触发器的SQL语句。后来的触发器可能重复这一行为并激发另一个触发器。这样就创建了连锁触发(cascading trigger)。Oracle 11g和更早的版本将连锁触发的数量限制为32,超过这个数时就会抛出异常。

下面概括了5种触发器类型及它们的用途。

●???????数据定义语言触发器??当创建、修改或删除数据库模式中的对象时会激发这些触发器。它们有助于控制或监控DDL语句。instead-of create表触发器提供了一个工具,它可以确保表的创建符合开发标准,比如包括存储或分区子句。也可以用它们监控不良的编程行为,比如当程序创建和删除临时表而不是使用Oracle集合时。临时表会分割磁盘空间,随着时间的推移而降低数据库的性能。

●???????数据操作语言触发器??当在表中执行插入、更新或删除数据的操作时激活这些触发器。可以分别用语句级或行级触发器类型对表上的所有修改或每行的修改激发一次触发器。DML触发器可用来控制DML语句。在修改值之前可以用这些触发器来审核、检查、保存和替换值。数值主键的自动编号经常通过一个行级DML触发器来完成。

●???????复合触发器??当在表中执行插入、更新或删除数据的操作时,这些触发器同时充当语句级和行级触发器的角色。该触发器可以捕获关于4个计时点的信息:(a)激发语句前;(b)激发语句中的每一行变化前;(c)激发语句中的第一行变化后;(d)激发语句后。当需要在语句和行事件级别中采取动作时,可以用这些类型的触发器来审核、检查、保存和替换值。

●???????instead-of触发器??这些触发器可以停止DML语句的执行,并重定向DML语句。INSTEAD OF触发器常用于管理编写不可更新的视图的方式。INSTEAD OF触发器向定义可更新的视图的表中应用业务规则