galbanum

学习是有始无终的事情

触发器(Trigger)(三)

 设计DML触发器的注意事项及技巧

在了解触发器的种类和工作理由之后,现在可以开始动手来设计触发器了,不过在动手之前,还有一些注意事项必须先了解一下:

 设计触发器的限制

在触发器中,有一些SQL语句是不能使用的,这些语句包括:

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触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上。

一个数据表可以有多个触发器,但是一个触发器只能对应一个表。

在同一个数据表中,对每个操作(如InsertUpdateDelete)而言可以建立许多个After触发器,但Instead Of触发器针对每个操作只有建立一个。

如果针对某个操作即设置了After触发器又设置了Instead Of触发器,那么Instead of触发器一定会激活,而After触发器就不一定会激活了。

l  Truncate Table语句虽然类似于Delete语句可以删除记录,但是它不能激活Delete类型的触发器。因为Truncate Table语句是不记入日志的。

l  WRITETEXT语句不能触发InsertUpdate型的触发器。

不同的SQL语句,可以触发同一个触发器,如InsertUpdate语句都可以激活同一个触发器。

 
阅读更多
个人分类: SQLServer
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭