表级触发器都是基于表中数据的触发器,它通过针对相应表对象的插入/删除/修改等DML语句触发。
触发动作
激发表级触发器的触发动作是三种数据操作命令,即INSERT、DELETE和UPDATE操作。在触发器定义语句中用关键字INSERT、DELETE和UPDATE指明构成一个触发器事件的数据操作的类型,其中UPDATE触发器会依赖于所修改的列,在定义中可通过UPDATE OF <触发列清单>的形式来指定所修改的列,<触发列清单>指定的字段数不能超过128个。
触发级别
根据触发器的级别可分为元组级(也称行级)和语句级。
元组级触发器,对触发命令所影响的每一条记录都激发一次。假如一个DELETE命令从表中删除了1000行记录,那么这个表上的元组级DELETE触发器将被执行1000次。元组级触发器常用于数据审计、完整性检查等应用中。元组级触发器是在触发器定义语句中通过FOR EACH ROW子句创建的。对于元组级触发器,可以用一个WHEN子句来限制针对当前记录是否执行该触发器。WHEN子句包含一条布尔表达式,当它的值为TRUE时,执行触发器;否则,跳过该触发器。
语句级触发器,对每个触发命令执行一次。例如,对于一条将500行记录插入表TABLE_1中的INSERT语句,这个表上的语句级INSERT触发器只执行一次。语句级触发器一般用于对表上执行的操作类型引入附加的安全措施。语句级触发器是在触发器定义语句中通过FOR EACH STATEMENT子句创建的,该子句可缺省。
触发时机
触发时机通过两种方式指定。一是通过指定BEFORE或AFTER关键字,选择在触发动作之前或之后运行触发器;二是通过指定INSTEAD OF关键字,选择在动作触发的时候,替换原始操作,INSTEAD OF允许建立在视图上,并且只支持行级触发。
在元组级触发器中可以引用当前修改的记录在修改前后的值,修改前的值称为旧值,修改后的值称为新值。对于插入操作不存在旧值,而对于删除操作则不存在新值。
对于新、旧值的访问请求常常决定一个触发器是BEFORE类型还是AFTER类型。如果需要通过触发器对插入的行设置列值,那么为了能设置新值,需要使用一个BEFORE触发器,因为在AFTER触发器中不允许用户设置已插入的值。在审计应用中则经常使用AFTER触发器,因为元组修改成功后才有必要运行触发器,而成功地完成修改意味着成功地通过了该表的引用完整性约束。




