雨落天涯

问花花不语,为谁落,为谁开。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

触发器(trigger)是一种特殊类型的存储过程,它不同于普通的存储过程。它的执行主要是通过事件进行触发来执行,而存储过程可以通过存储过程名称而被直接调用。比如说,当我们对一个表格进行添加,删除,修改等操作时,触发器就会被激活而执行。


确保数据的完整性,是触发器的一个重要的功能,在SQL Server中利用CHECK约束也可以检查数据的完整性,但是与CHECK约束相比,触发器可以强制实现更加复杂的数据完整性,而且它还可以参考其他表的字段。


触发器的作用:

1.级联修改数据库中相关的表

例如,在数据库company中有两个表project和customer,表project中包含项目信息和项目的合作客户名,而customer表则存储所有客户的信息。如果删除了customer表中的某一客户,如张三,那么在project表中所有和该客户有关的项目记录都做相应的调整。也就是说,在两个有关系的表中,你从一个表里面删除记录时,这个触发器会相应的从另一个表中做出相应的删除。


2.执行比核查约束更为复杂的约束操作

在触发器中可以书写更复杂的T-SQL语句 。例如可以引用多个表,并使用if...else等语句做更复杂的检查。


3.拒绝或回滚违反引用完整的操作。 

检查对数据表的操作是否违反引用完整性,并选择相应的操作。 


4.比较表修改数据之间的差别,并根据差别采取相应的操作。 

例如,若想规定每次该商品的价格变动幅度不能超过20%,使用触发器,就可以将修改后的表数据和修改前的表数据进行比较,如果超过了20%,可以回滚该修改操作。 


触发器的类型:

1.Update :在表上进行更新操作时触发

2.Insert :在表上进行更新操作时触发

3.Delete:在表上进行删除记录时触发

4.Instead  of :不执行插入、更新或删除操作时,将触发Instead of 触发器。

5.After:在一个触发动作发生之后激发,并提供一种机制以便控制多个触发器的执行顺序。 


AFTERINSTEAD OF是两个新增的触发器

AFTER要求只有执行某一操作(INSERT.UPDATE.DELETE)之后触发器才被触发,且只能在表上定义。 

对于AFTER触发器,可以定义哪一个触发器最先被触发,哪一个最后被触发,通常使用系统过程sp_settrigger order 来完成此任务。

INSTEAD OF 触发器表示并不执行所定义的操作,而仅是执行触发器本身。既可以在表上定义INSTER OF 触发器,也可以在视图上定义,但对同一操作只能定义一个INSTEAD OF 触发器。 


使用T-SQL管理触发器

1.创建触发器

其语法形式如下:

.CREATE TRIGGER trigger_name (触发器名称)

ON table | view (表或视图)

[WITH ENCRYPT I ON]

{FOR | AFTER | INSTEAD OF }

{ [ INSERT ][ , ] [ UPDATE ] [ , ] [ DELETE ] }

AS 

  sql_statements [...n]


例如:创建一个DELETE 触发器

在class表上删除一个学生的记录时,相应的应从infor表中删除该学生对应的所有记录。

CREATE TRIGGER Delete_trig

ON  class

AFTER DELETE

AS 

DELETE FROM infor

WHERE 学号= (SELECT 学号 FROM DELETE)

GO 


2.查看触发器相关数据

.使用系统存储过程sp_helptrigger 其语法形式如下:

exec sp_helptrigger 'table'[,'type']

.其中:table:触发器所在的表名

Type:指定列出的操作类型的触发器。


3.查看触发器的定义文本

通过执行系统存储过程sp_helptext 其语法形式如下:

Sp_helptext 'trigger_name'


4.查看触发器的所有者和创建日期

.使用系统存储过程 sp _help,其语法形式如下:.

.Exec sp_help 'trigger_name'


5.修改触发器

若希望对现有触发器进行修改,可以使用alter trigger语句,其语法刑式如下:

.ALTER TRIGGER trigger_name 

ON table | view 

[WITH ENCRYPTION]

{FOR | AFTER |INSTEAD OF }

{ [DELETE ] [,] [INSERT ] [,] [UPDATE]}

AS 

    sql_statement [...n]


6.触发器更名

.使用系统存储过程sp_rename完成。其语法形式如下:

.sp_rename oldname ,newname 


7.删除触发器

使用drop trigger 语句,其语法形式如下:

.Drop trigger trigger_name [...n]

.其中trigger_name是触发器名称,可以同时删除多个触发器。

注意:当删除数据表时,也将同时删除所有与该数据表相关联的触发器。也就是说只要你把表删除了,你在这个表上建立的所有触发器都将被删除!而且当删除触发器时,系统也将从sysobjects和syscomments系统表中删除有关该触发器的信息。 


触发器,就像是我们生活当中常用到的那个闹钟,或者是定时炸弹,只要你添加了相应的操作,它就会就会自动激活执行!





posted on 2012-07-26 17:30  雨落天涯  阅读(250)  评论(0编辑  收藏  举报