7. 触发器

7. 触发器,第1张

文章目录 触发器的分类1. DML触发器(分为:AFTER触发器、INSTEAD OF触发器)2. DDL 触发器(了解 ) 创建触发器需要注意的问题创建触发器1. DML触发器1.1关于for、after的使用例子1:为学生表创建一个简单DML触发器, 在插入和修改数据时,都会自动显示提示信息。例子2:在学生表上创建一个DELETE类型的触发器,删除数据时,显示删除学生的个数。例子3:含插入表:Inserted,删除表:Deleted。例子4:Inserted和Deleted具体应用其他不重要例子 1.2 关于instead of的使用 2. DDL触发器例子1:使用DDL触发器limited来防止数据库中的任一表被修改或删除(自定义错误提示)。 3. 查看触发器内容 、删除触发器、触发器禁用和启用(不重要)

触发器作用:
当对某一张表进行诸如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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/996128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存