SQL Server学习笔记——触发器
Posted Aiden_Zhao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server学习笔记——触发器相关的知识,希望对你有一定的参考价值。
SQL Server学习笔记——触发器
触发器主要用于监视某种活动,并触发某种操作,当对一个表格进行增删改就有可能自动激活并执行它。
触发器定义语句:
create trigger t_name on table_name
after --或 instead of,分别表示之后或之前
update --或 insert,delete,分别表示对表的具体操作
as
begin
--代码段
end
具体地,若要定义一个在stu表插入操作之后的一个触发器,则可以写为:
create trigger t1 on stu after insert
as
begin
--代码段
end
1. 学生人数不能大于17
① 执行插入操作之后激活触发器:
当前stu表中学生人数为16,执行插入操作后,若表中人数大于17则输出错误信息,并撤销插入操作:
create trigger t1 on stu after insert
as
begin
if (select COUNT(*) from stu) > 17
begin
print 'error'
rollback tran --撤销上一步的插入操作
end
else
begin
print 'right'
end
end
当我们执行一条插入语句:
insert into stu(sno, sname) values('2020018', 'kk')
插入之后stu表中学生信息为恰好为17,则输出正确信息:
当我们再次执行一条插入语句:
insert into stu(sno, sname) values('2020019', 'kkk')
此时,stu表中学生人数大于17,则输出错误信息:
② 执行插入操作之前激活触发器:
当前stu表中学生人数为16,执行插入操作之前,首先判断表中学生人数,之后决定时候进行插入:
create trigger t2 on stu instead of insert
as
begin
if (select COUNT(*) from stu) > 16
begin
print 'error'
rollback tran
end
else
begin
print 'right'
--插入前激活触发器,触发器不自动进行插入操作,需要自己手写插入操作
declare @sno varchar(13) --声明变量
declare @sname varchar(30)
select @sno = sno from inserted --
select @sname = sname from inserted
insert into stu(sno, sname) values(@sno, @sname)
end
end
注:
- inserted 表用于存储 insert 和 update 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中,inserted 表中的行是触发器表中新行的副本。
- deleted 表用于存储 delete 和 update 语句所影响的行的复本。在执行 delete 或 update 语句时,行从触发器表中删除,并传输到 deleted 表中,deleted 表和触发器表通常没有相同的行。
2. 学生人数不能小于16
执行删除操作之后,判断stu表中学生数目,若数量小于16,则返回错误,并撤销删除操作:
create trigger t3 on stu after delete
as
begin
if (select COUNT(*) from stu) < 16
begin
print 'error'
rollback tran
end
else
begin
print 'right'
end
end
当删除一名学生信息后,学生数量小于16时,则会激活触发器,反馈错误信息:
3. 当新增学生成绩为55-60分时,改为60分
在插入操作之前判断即将插入成绩的大小,若成绩在55-60分,则统一改成60分。
create trigger t4 on sc instead of insert
as
begin
declare @cno varchar(13)
declare @sno varchar(13)
declare @grade decimal(5, 2)
select @cno = cno from inserted
select @sno = sno from inserted
select @grade = grade from inserted
if @grade >= 55 and @grade < 60
begin
set @grade = 60
end
insert into sc values(@cno, @sno, @grade)
end
执行插入语句:
insert into sc values('20202', '20200016', 57)
insert into sc values('20201', '20200016', 85)
插入结果为:
可见,第一条插入语句中的成绩为57分,成功改为60分;而第二条插入语句中的分数为85分,由于不在55-60之间,则保持不变。
以上是关于SQL Server学习笔记——触发器的主要内容,如果未能解决你的问题,请参考以下文章