触发器(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:在一个触发动作发生之后激发,并提供一种机制以便控制多个触发器的执行顺序。
AFTER和INSTEAD 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系统表中删除有关该触发器的信息。
触发器,就像是我们生活当中常用到的那个闹钟,或者是定时炸弹,只要你添加了相应的操作,它就会就会自动激活执行!