触发器概念: 触发器是一种特殊类型的存储过程,它不同于普通的存储过程.触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用.当往一个表格中插入记录,修改记录或者删除记录时,sql server 就会自动执行触发器所定义的sql语句,以确保数据的完整性.
与check约束相比,触发器可以强制实现更加复杂的数据完整性,而且可以参考其他表的字段.
触发器可以扩展sql server约束,默认值和规则的完整性检查逻辑,但只要约束和默认值提供了全部所需的功能,就应使用约束和默认值
触发器的作用
触发器可以使用t-sql语句进行复杂的逻辑处理,它基于一个表创建,但是可以对多个表进行操作,因此常常用于复杂的业务规则.
1>级联修改数据库中相关的表
2>执行比核查约束更为复杂的约束操作
3>拒绝或回滚违反引用完整性的操作. (检查对数据表的操作是否违反引用完整性,并选择相应的操作.)
4>比较表修改前后数据之间的差别,并根据差别采取相应的操作.
例:若想规定每次工资的变动幅度不能超过40%,使用触发器可以将修改后的表数据和修改前的表数据进行比较,若超出40%,可以
回滚该修改操作.
触发器的类型
update触发器:在表上进行更新操作时触发
insert触发器:在表上进行插入操作时触发
delete触发器:在表上进行删除操作时触发
after触发器:在一个触发动作发生之后激发,并提供一种机制以便控制多个触发器的执行顺序
要求只有执行某一操作之后(insert update delete)触发器才被触发,且只能在表上定义.可以为针对表的同一操作定义多
个触发器.对于after触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder
来完成此任务
instead of 触发器: 并不执行其所定义的操作(insert update delete),而仅是执行触发器本身.既可以在表上定义instead of触发器,
也可以在视图上定义instead of触发器,但对同一个操作只能定义一个instead of触发器
触发器的主要优点
触发器是自动的:当对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后,立即被激活
触发器可以通过数据库中的相关表进行层叠更改
触发器可以强制限制,这些限制比用check约束所定义的更复杂.而且比使用核查约束更为方便的是,触发器可以引用其他数据表中的列.
创建触发器的规则和限制
1>create trigger语句必须是批处理中的第一个语句,且该批处理中随后出现的其他所有语句都将被解释为create trigger语句定义的一部
分
2>在默认情况下,创建触发器的权限将被分配给数据表的所有者,且不能将该权限转给其他用户
3>触发器是数据库对象,其名称必须遵循标识符的 命名规则
4>虽然触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器
5>虽然不能在临时数据库上创建触发器,但是触发器可以引用临时数据表
6>既不能在系统数据表创建触发器,也不可以引用系统数据表
7>在包含使用delete后update操作定义的外键的表中,不能定义instead of和instead of update触发器
8>虽然truncate table语句类似于没有where子句(用于删除行)的delete语句,但它并不会引发delete触发器,因为truncate table
语句没有被记入日志
9>writetext语句不会引发insert或update触发器
10>下列语句不可以用于创建触发器:alter database create database disk init disk resize drop
database load database load log reconfigure restore database restore log
11>当创建一个触发器时必须指定 名称 在其上定义触发器的表 触发器将何时激发 及或触发器的数据修改语句
创建触发器 格式:createte trigger trigger_name on table | view [ with encryption ] { for | after | instead of } { [insert ] [,] [ update ] [,] [ delete ] } as sql_statements [...n]
各参数含义: table 用于用户创建的触发器相关联的表的名字,并且该表已经存在.
delete insert update 关键字用来指明哪种数据操作将激活触发器,至少要指明一个选项,在触发器的定义中三者的顺序不受限制,且各选项要用逗号隔开
after 表示只有在执行了指定的操作insert delete update之后触发器才能被激活,执行触发器中的sql语句.若使用关键字for,则表示为after触发器,且该类型触发器仅能在表上创建.
例子: use company
go
create trigger 触发器_欢迎新员工
on employee
after insert
as
print '新员工加入本公司,欢迎欢迎!'
go
使用系统存储过程sp_helptrigger查看触发器相关数据
exec sp_helptrigger 'table' [, 'type']
type指定列出的操作的类型的触发器.若不指定,则列出所有的触发器
查看触发器的定义文本
sp_helptext 'trigger_name'
查看触发器的所有者和创建日期
exec sp_help 'trigger_name'
触发器更名
sp_rename oldname,newname
删除触发器
drop trigger trigger_name [,...]
当删除数据表时,也将同时删除所有与该数据表相关联的触发器.而且当删除触发器时,系统也将从sysobjects和syscomments系
统表中删除有关该触发器的信息