使用 INSTEAD OF 触发器
INSTEAD OF 触发器替代触发语句的标准操作(INSERT、UPDATE 或 DELETE)。例如,可以定义 INSTEAD OF 触发器在一列或多列上执行错误或值的检查,然后在插入记录之前执行其它操作 例如,当工资表中小时工资列的更新值超过指定值时,可以定义触发器或者产生错误信息并回滚该事务,或者在审核日志中插入新记录(在工资表中插入该记录之前)。有关更多信息,请参见设计 INSTEAD OF 触发器。
触发器执行
如果发生约束侵犯,则永远不会执行 AFTER 触发器,因此这些触发器不能用于任何可能防止约束侵犯的处理。
执行 INSTEAD OF 触发器而不是通常的触发动作。在创建将更改反映到基表的 inserted 和 deleted 表之后,但在执行任何操作之前执行这些触发器。这些触发器在执行任何约束前执行,因此可执行预处理以补充约束操作。
如果某个表上定义的 INSTEAD OF 触发器对该表执行一个通常将再次激发 INSTEAD OF 触发器的语句,则将不递归调用该触发器。相反,将视该表为没有 INSTEAD OF 触发器来处理该语句,并启动约束操作与 AFTER 触发器执行之间的链。例如,如果将触发器定义为一个表的 INSTEAD OF INSERT 触发器,并且该触发器在同一表上执行 INSERT 语句,则由 INSTEAD OF 触发器执行的 INSERT 语句不会再次调用该触发器。该触发器执行的 INSERT 将启动这样的进程,执行约束操作并激发为表定义的任何 AFTER INSERT 触发器。
如果视图上定义的 INSTEAD OF 触发器对该视图执行一个通常将再次激发 INSTEAD OF 触发器的语句,则将不递归调用该触发器。而是将该语句解析为对视图的基础基表的更改。在这种情况下,视图定义必须满足对可更新视图的所有限制。有关可更新视图的定义,请参见通过视图修改数据。例如,如果将触发器定义为某个视图的 INSTEAD OF UPDATE 触发器,并且该触发器执行引用该视图的 UPDATE 语句,则由 INSTEAD OF 触发器执行的 UPDATE 语句不会再次调用该触发器。在处理该触发器对视图执行的 UPDATE 语句时,将视图看作没有 INSTEAD OF 触发器一样对待。UPDATE 更改的列必须解析到单个基表。对基础基表所做的每个修改将启动应用约束和激发为表定义的 AFTER 触发器之间的链。