概述
设计DML触发器的注意事项及技巧
在了解触发器的种类和工作理由之后,现在可以开始动手来设计触发器了,不过在动手之前,还有一些注意事项必须先了解一下:
设计触发器的限制
在触发器中,有一些SQL语句是不能使用的,这些语句包括:
表1 在DML触发器中不能使用的语句
不能使用的语句 | 语句功能 |
Alter Database | 修改数据库 |
Create Database | 新建数据库 |
Drop Database | 删除数据库 |
Load Database | 导入数据库 |
Load Log | 导入日志 |
Reconfigure | 更新配置选项 |
Restore Database | 还原数据库 |
Restore Log | 还原数据库日志 |
另外,在对作为触发操作的目标的表或视图使用了下面的SQL语句时,不允许在DML触发器里再使用这些语句:
表2 在目标表中使用过的,DML触发器不能再使用的语句
不能使用的语句 | 语句功能 |
Create Index | 建立索引 |
Alter Index | 修改索引 |
Drop Index | 删除索引 |
DBCC Dbreindex | 重新生成索引 |
Alter Partition Function | 通过拆分或合并边界值更改分区 |
Drop Table | 删除数据表 |
Alter Table | 修改数据表结构 |
如何在触发器取得字段修改前和修改后的数据
上面介绍过,SQL Server 2005在为每个触发器都定义了两个虚拟表,一个是插入表(inserted),一个是删除表(deleted),现在把这两个表存放的数据列表说明一下:
表11.3 插入/删除表的功能
激活触发器的动作 | Inserted表 | Deleted表 |
Insert | 存放要插入的记录 |
|
Update | 存放要更新的记录 | 存放更新前的旧记录 |
Delete |
| 存放要删除的旧记录 |
以上面删除库存产品记录为例,在删除时触发器要判断库存数量是否为零,那么判断就应该这么写:
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语句都可以激活同一个触发器。
最后
以上就是丰富朋友为你收集整理的触发器(Trigger)(三)的全部内容,希望文章能够帮你解决触发器(Trigger)(三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复