触发器
时间:2010-11-04 来源:稍侯..。纠结
触发器是一种特殊类型的存储过程,不由用户直接调用。
创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。
CREATE PROCEDURE 或 CREATE TRIGGER 语句不能跨越批处理。
即存储过程或触发器始终只能在一个批处理中创建并编译到一个执行计划中。
常见的触发器有三种:分别应用于 insert、update、delete事件
2、触发器的优点:
触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。
与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,
以及执行其它操作,如修改数据或显示用户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
3、触发器限制
CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用到一个表中。
触发器只能在当前的数据库中创建,不过触发器可以引用当前数据库的外部对象。
如果指定触发器所有者名称以限定触发器,请以相同的方式限定表名。
在同一条 CREATE TRIGGER 语句中,可以为多种用户操作(如 INSERT 和 UPDATE)定义相同的触发器操作。
如果一个表的外键在 DELETE/UPDATE 操作上定义了级联,则不能在该表上定义 INSTEAD OF DELETE/UPDATE 触发器。
在触发器内可以指定任意的 SET 语句。所选择的 SET 选项在触发器执行期间有效,并在触发器执行完后恢复到以前的设置。
.总结:
触发器能保持数据的完整性与一致性,它可以方便地基于一个表的修改,自动更新其他相关表的记录,以保证数据的完整性。
在数据库的应用中,触发器扮演着很重要的角色。
无论是作为提供高级参照完整性功能的途径,还是执行自动维护非正规化数据的任务,
触发器都能帮助用户实现满足实际需要的规则,简化业务逻辑,并使系统更方便更有效。
触发器实例:
create database studentbook
go
use studentbook
create table student( --学生表
studentID int not null primary key, --学号
studentName varchar(20) ) --名字
go
use studentbool
create table BorrowRecord( --学生借书记录
BorrowRecord int identity(1,1), --流水号
studentID int, --学号
borrowDate datetime, --借出时间
ReurnDate datetime) --归还时间
--创建一个update触发器
create trigger trustudent
on student --在student表中创建触发器
for update --为什么事件触发
as
if update(studentID)
begin
update BorrowRecord
set studentID=i.studentID
from BorrowRecord br,delete d,insert i --delete 和insert临时表,分别表示触发器事件的表 旧的一条记录和新的··
where br.studentID=d.studentID
end
--创建一个Delete触发器
create trigger trdstudent
on student
for delete
as
delete BorrowRecord
from BorrowRecord br,delete d
where br.studentID=d.studentID