7. 触发器

触发器作用:
当对某一张表进行诸如UPDATEINSERTDELETE这些操作时,SQL Server 就会自动执行触发器所定义的SQL语句



触发器的分类

1. DML触发器(分为:AFTER触发器、INSTEAD OF触发器)

是当在数据库服务器中,发生数据操作语言(DML)事件时会自动执行的存储过程。
DML事件包括:在指定表或视图中修改数据的INSERT、UPDATE或DELETE语句。

系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误,则整个事务自动回滚。

分为:
(1)AFTER触发器(也就是for触发器):这类触发器是在记录已经改变完之后,才会被激活执行,它主要是用于记录变更后的处理或检查。

(2)INSTEAD OF触发器:与AFTER触发器不同,这类触发器一般是用来取代原本的操作在记录变更之前发生的,它并不去执行原来SQL语句里的操作(UPDATE、INSERT、DELETE),而去执行触发器本身所定义的操作。

2. DDL 触发器(了解 )

在响应数据定义语言(DDL,create、alter和drop)语句时触发。
添加、删除或修改数据库的对象,一旦误操作,可能导致大麻烦。
如果想能够跟踪这种问题和定位问题的根源,就可以利用DDL触发器来记录类似“用户建立表”这种变化的操作,这样可以大大减轻跟踪和定位数据库模式的变化的繁琐程度。



创建触发器需要注意的问题

在这里插入图片描述



创建触发器

语法格式:

在这里插入图片描述

1. DML触发器

1.1关于for、after的使用

例子1:为学生表创建一个简单DML触发器, 在插入和修改数据时,都会自动显示提示信息。
CREATE TRIGGER reminder ON student
FOR  INSERT , UPDATE  
AS print '你在插入或修改学生表的数据'


触发语句: 
UPDATE student SET sname='刘小梅' WHERE sname='刘梅'



例子2:在学生表上创建一个DELETE类型的触发器,删除数据时,显示删除学生的个数。
CREATE TRIGGER del_count ON student
FOR DELETE
AS
  DECLARE @count varchar(50)
  SET @count=STR(@@ROWCOUNT) + ' 个学生被删除'  
  SELECT @count
RETURN


触发语句: 
	DELETE FROM student WHERE specialty='计算机'



例子3:含插入表:Inserted,删除表:Deleted。

SQL Server 为每个DML触发器都定义了两个特殊的表,一个是插入表:Inserted,一个是删除表:Deleted

  • 不是真正存储在数据库中的物理表。对于这两个表,用户只有读取的权限,没有修改的权限
  • 在触发器的执行过程中,SQL Server建立和管理这两个临时表。
    这两个表的结构与触发器所在数据表的结构是完全一致的,其中包含了在激发触发器的操作中插入或删除的所有记录。
  • 当触发器的工作完成后,这两个表也将会从内存中删除

两个临时表的作用:

在这里插入图片描述

update触发器

if exists(select name from sysobjects where name='trig_2' and type='TR')
	drop trigger trig_2
go

create trigger trig_2 
on student
after update                         
as 
	print 'inserted表'
	select * from inserted
	print 'deleted表'
	select * from deleted
go



update student set sname='关二' where sno='2009001'

在这里插入图片描述

insert触发器

create trigger trig_3 
on student
after insert                       
as 
	print 'inserted表'
	select * from inserted
	print 'deleted表'
	select * from deleted
go
insert student values('200908','刘一百',85,'male','CS','china')
drop trigger trig_3
go

在这里插入图片描述

delete触发器

create trigger trig_4 
on student
after delete                         
as 
	print 'inserted表'
	select * from inserted
	print 'deleted表'
	select * from deleted
go
delete student where sno=100

在这里插入图片描述



例子4:Inserted和Deleted具体应用
创建触发器trig5,删除student表中的学生记录时,同时删除sc表中对应的记录

create trigger trig_5 on student
for delete
as 
 delete sc
 where sc.sno in(select sno from deleted)
go


delete student where sno='3'
select * from student
select * from sc 
go



其他不重要例子
触发器实现表上约束
create trigger trig_g_1 
on sc
after insert
as
begin
	declare @s int
	select @s=score from inserted
	if @s<0
	begin
	     select '成绩必须>=0'
	     rollback
	end
end
go

--执行以下程序,观察结果
insert into sc values('1','5',-50)
select * from sc
--drop trigger trig_g_1  先留着后面会用
--------------------------------------------------------------



create trigger trig_g_2 
on sc
instead of insert
as
begin
	declare @s_no char(6),@c_no char(4),@s int
	select @s_no=sno,@c_no=cno,@s=score from inserted
	if @s<0
	begin
	     select '成绩必须>=0'
	     insert sc values(@s_no,@c_no,0)
	end
end
go

--执行以下程序,观察结果
insert into sc values('1','5',-50)
select * from sc
delete from sc where sno='1' and cno='5'
drop trigger trig_g_2
------------------------------------------------------------------------------




建立一个修改触发器trigno,该触发器防止用户修改表student的学号
create trigger trigno
on student
after update
as
if update(sno)
	begin
		raiserror('不能修改学号',16,2)  --raiserror()用于抛出一个异常或错误
		rollback
	end
go

--执行以下程序,观察结果
update student set sno='200' where sno='2'
select * from student
drop trigger trigno
-------------------------------------------------------------------------



1.2 关于instead of的使用

create trigger trig_6
on student
instead of insert
as
	select * from student
go

--执行以下程序,观察结果
insert into student values('200908','刘一百',85,'male','CS','china')
drop trigger trig_6
go

在这里插入图片描述



2. DDL触发器

例子1:使用DDL触发器limited来防止数据库中的任一表被修改或删除(自定义错误提示)。

CREATE TRIGGER limited
ON database
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT '触发器不允许您执行对表的修改或删除操作!' 
   ROLLBACK 

触发语句: ALTER TABLE student  ADD birth datetime



3. 查看触发器内容 、删除触发器、触发器禁用和启用(不重要)

exec sp_helptext trig_1    --查看触发器内容 
exec sp_helptrigger student   --查看表上的触发器的属性
select * from sysobjects where xtype='TR'  --查看数据库中已有的触发器


drop trigger trig_1


/*触发器禁用和启用*/

/*禁用sc表上的触发器trig_g。有如下两种方法:*/
alter table sc disable trigger trig_g_1
disable trigger trig_g_1 on sc
go

/*启用sc表上的触发器trig_g_1。*/
alter table sc enable trigger trig_g_1
enable trigger trig_g_1 on sc
go

--执行以下程序,观察结果
insert into sc values('2','5',-500)
select * from sc
--delete from sc where sno='2' and cno='5'
drop trigger trig_g_1
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你说的白是什么白_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值