设计DML触发器的注意事项及技巧 在了解触发器的种类和工作理由之后,现在可以开始动手来设计触发器了,不过在动手之前,还有一些注意事项必须先了解一下: 设计触发器的限制 在触发器中,有一些SQL语句是不能使用的,这些语句包括: 表1 在DML触发器中不能使用的语句
另外,在对作为触发操作的目标的表或视图使用了下面的SQL语句时,不允许在DML触发器里再使用这些语句: 表2 在目标表中使用过的,DML触发器不能再使用的语句
如何在触发器取得字段修改前和修改后的数据 上面介绍过,SQL Server 2005在为每个触发器都定义了两个虚拟表,一个是插入表(inserted),一个是删除表(deleted),现在把这两个表存放的数据列表说明一下: 表11.3 插入/删除表的功能
以上面删除库存产品记录为例,在删除时触发器要判断库存数量是否为零,那么判断就应该这么写: If (Select 库存数量 From Deleted)>0 Begin Print ‘库存数量大于零时不能删除此记录’ Rollback Transaction End 其他注意事项 l After触发器只能用于数据表中,Instead Of触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上。 l 一个数据表可以有多个触发器,但是一个触发器只能对应一个表。 l 在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立许多个After触发器,但Instead Of触发器针对每个操作只有建立一个。 l 如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活了。 l Truncate Table语句虽然类似于Delete语句可以删除记录,但是它不能激活Delete类型的触发器。因为Truncate Table语句是不记入日志的。 l WRITETEXT语句不能触发Insert和Update型的触发器。 l 不同的SQL语句,可以触发同一个触发器,如Insert和Update语句都可以激活同一个触发器。 |
|