触发器(Trigger)
概念
触发器(trigger)是 SQL Server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器与存储过程的区别
触发器与存储过程的区别是运行方式的不同,触发器不能执行 EXECUTE 语句调用,而是在用户执行 Transact-SQL 语句时自动触发执行,而存储过程需要用户、应用程序或者触发器来显式地调用并执行。
触发器的优点
- 触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
- 触发器可以通过数据库中的相关表进行层叠修改。
- 触发器可以强制限制。这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其他表中的列。
创建触发器的语法
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
AS
T-SQL语句
GOCode language: PHP (php)
创建学生表
create table student(
stu_id int identity(1,1) primary key,
stu_name varchar(10),
stu_gender char(2),
stu_age int
)
创建 INSERT 触发器
create trigger trig_insert
on student
after insert
as
begin
if object_id(N'student_sum',N'U') is null
create table student_sum(stuCount int default(0));
declare @stuNumber int;
select @stuNumber = count(*) from student;
if not exists (select * from student_sum)
insert into student_sum values(0);
update student_sum set stuCount = @stuNumber;
endCode language: JavaScript (javascript)
测试触发器:
insert into student(stu_name,stu_gender,stu_age) values('吕布','男',30);
select stuCount 学生总人数 from student_sum;
insert into student(stu_name,stu_gender,stu_age) values('貂蝉','女',30);
select stuCount 学生总人数 from student_sum;
insert into student(stu_name,stu_gender,stu_age) values('曹阿瞒','男',40);
select stuCount 学生总人数 from student_sum;Code language: JavaScript (javascript)
禁止插入触发器
create trigger insert_forbidden
on student_sum
after insert
as
begin
RAISERROR('禁止直接向该表中插入记录,操作被禁止',1,1)
rollback transaction
endCode language: JavaScript (javascript)
insert student_sum (stuCount) values(5);
创建 DELETE 触发器
create trigger trig_delete
on student
after delete
as
begin
select stu_id as 已删除的学生编号, stu_name, stu_gender, stu_age
from deleted
endCode language: JavaScript (javascript)
delete from student where stu_id=1;Code language: JavaScript (javascript)
创建 UPDATE 触发器
create trigger trig_update
on student
after update
as
begin
declare @stuCount int;
select @stuCount = count(*) from student;
update student_sum set stuCount = @stuCount;
select stu_id as 更新前学生编号, stu_name as 更新前学生姓名 from deleted
select stu_id as 更新后学生编号, stu_name as 更新后学生姓名 from inserted
endCode language: PHP (php)
update student set stu_name='张飞' where stu_id=2;Code language: JavaScript (javascript)
创建 INSTEAD OF 触发器
create trigger trig_insteadOf
on student
instead of insert
as
begin
declare @stuAge int;
select @stuAge = (select stu_age from inserted)
if(@stuAge > 120)
select '插入年龄错误' as '失败原因'
endCode language: JavaScript (javascript)
Previous: INTO