触发器的使用,其实在日常生活中还是很有帮助的。当你对一张表进行数据的怎删改查操作的时候,同时也相对另外一张甚至几张表进行同步修改操作,这个时候就会运用到触发器的概念。
我记得我刚接触触发器的时候是因为我的毕业设计需求。当对员工表进行修改时,自动修改管理员表,这里用到了update触发器;当对员工表进行新增的时候,自动在管理员表中添加字段,并且创建初始的用户名,密码,这里用到了insert触发器。
触发器的运用可以极大程度上的减少我们对于多张表同时添加数据时的复杂程度。
下面是我自己练习时使用的测试代码:
/*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--判断student_sum表是否存在
create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表
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;--把更新后总的学生数插入到student_sum表中
end*/
--测试触发器trig_insert-->功能是向student插入数据的同时级联插入到student_sum表中,更新stuCount
--因为是后触发器,所以先插入数据,才出发触发器;
--drop trigger tri_delete;
/*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;*/
/*--创建insert_forbidden,禁止用户向student_sum表中插入数据
create trigger insert_forbiggen
on student_sum
after insert
as
begin
RAISERROR('禁止直接向该表中插入数据,操作被禁止',1,1)--raiserror是用于抛出一个错误
rollback transaction
end*/
--触发触发器insert_forbiggen
/*insert into
student_sum(stuCount)values(6);*/
--创建delete触发器
/*create trigger trig_delete
on student
after delete
as
begin
select stu_id as 已删除的学生编号,stu_name,stu_gender,stu_age
from deleted
end*/
--执行一条delete语句触发trig_delete触发器
--delete from student where stu_id = 7;
--创建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
end*/
--创建完成,执行一条语句触发trig_update触发器
--update student set stu_name = '张飞' where stu_id = 8;
--创建替代触发器
--创建instead of触发器
/*create trigger trig_inteadOf
on student
instead of insert
as
begin
declare @stuAge int;
select @stuAge = (select stu_age from inserted)
if(@stuAge > 120)
select '插入年龄错误' as '失败原因'
end*/
--执行语句触发
--insert into student (stu_name,stu_gender,stu_age) values ('子龙','男',130);
--禁用嵌套
--exec sp_configure 'nested triggers',0;
--启用嵌套
--exec sp_configure 'nested triggers',1;
--查看触发器
--查看数据库中所有的触发器
/*use student
go
select * from sysobjects where xtype = 'TR'*/
--.sp_helptext查看触发器内容
/*use student
go
exec sp_helptext 'trig_insert'*/
--.sp_helptrigger查看触发器的属性
/*use student
go
exec sp_helptrigger student*/
--禁用触发器
--alter table student disable trigger trig_insert
--禁用触发器
--alter table student enable trigger trig_insert