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 表用于存储 insertupdate 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中,inserted 表中的行是触发器表中新行的副本。
  • deleted 表用于存储 deleteupdate 语句所影响的行的复本。在执行 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学习笔记——触发器的主要内容,如果未能解决你的问题,请参考以下文章

sql中触发器当修改学生班级信息时自动修改相应班级的学生人数

sql 触发器 子查询返回的不止一个值

sql 怎样创建触发器,分别实现增加、删除学生和修改学生班级信息时自动修改相应班级学生人数

数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器

学习 SQL Server :内置函数,触发器

《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结