SQL Server 2012 触发器



1.触发器

触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器里。任何用户对表的增删改操作均由服务器自动激活相应的触发器。触发器类似于约束,但是比约束更加灵活,可以实施更加复杂的检查和操作,具有更精细和更强大的数据控制能力。
常用的触发器有DDL触发器DML触发器,DDL触发器响应DDL事件,DDL事件主要包括:CREATE、ALTER、DROP;DML触发器响应DML事件,DML事件主要包括:INSERT、UPDATE、DELETE;
DML触发器又可以分为AFTER触发器INSTEAD OF触发器
AFTER触发器是后置触发器,在数据表中的数据发生变化之后才会被激活执行,AFTER触发器只适用于基本表,一个触发操作可以定义多个AFTER触发器
INSTEAD OF触发器是前置触发器,在数据表中的数据发生变化之前被激活执行,并取代数据变化的操作。INSTEAD OF触发器适用于表和视图,一个触发操作只能定义一个INSTEAD OF触发器。



2.创建触发器

有两个临时表与DML触发器密切相关,分别是插入表inserted表和删除表deleted表。
inserted表用于存储insert和update语句所影响的行的副本。在执行插入或更新事务的过程中,新行会同时添加到inserted表和触发器对应的表中。inserted表中的行是触发器表中的新行的副本。
deleted表用于存储delete和update语句所影响的行的副本。在执行delete或update语句过程中,行从触发器表中删除,并传输到deleted表中保存。
update更新操作相当于在删除操作之后执行插入操作。首先,旧行被复制到deleted表中,然后新行被复制到触发器表和inserted表中。
语法格式:

CREATE TRIGGER <触发器名>
ON <数据表|视图|DATABASE>
<AFTER|FOR|INSTEAD OF><触发事件>
AS
<触发动作体>

--AFTER与FOR均为后置触发器,版本兼容原因存在两种方式,本质无区别

使用示例1:创建student表插入数据DML触发器,插入数据后,提示插入成功

create trigger trig_student_insert
on student
after insert
as
print '插入数据成功'

使用示例2:创建student表插入数据DML触发器,提示拒绝插入,并阻止数据插入

方式一:
create trigger trig_student_denyinsert
on student
after insert
as
print '拒绝插入数据'
rollback  --事务回滚

方式二:
create trigger trig_student_denyinsert
on student
instead of insert
as
print '拒绝插入数据'

使用示例3:创建student表更新数据DML触发器,如果更新了StuName列,则提示更新失败,并阻止数据更新

create trigger trig_student_updateStuName
on student
after update
as
if update(StuName)
	begin
		print '修改了StuName属性,拒绝更新数据'
		rollback  --事务回滚
	end

使用示例4:创建student表删除数据DML触发器,删除数据是提示不允许删除数据,并阻止数据删除操作

方式一:
create trigger trig_student_denydelete
on student
after delete
as
print '不允许删除数据'
rollback

方式二:
create trigger trig_student_denydelete
on student
instead of delete
as
print '不允许删除数据'

使用示例5:创建student表插入数据DML触发器,插入数据时将数据中的StuName和Age插入到student_new表中,并提示插入成功

create trigger trig_student_insert
on student
after insert
as
begin
declare @StuName nvarchar(32)  --定义变量
declare @Age int
select @StuName=inserted.StuName,@Age=inserted.Age from inserted   --从inserted表中获取要插入的数据
insert into student_new(StuName,Age)  --插入数据到student_new表
values(@StuName,@Age)
print '插入数据成功'
end

使用示例6:创建student表删除数据DML触发器,删除数据时将student_new表中对应的数据删除,并提示删除成功

create trigger trig_student_delete
on student
after delete
as
begin
declare @StuName nvarchar(32)  --定义变量
select @StuName=deleted.StuName from deleted   --从deleted表中获取删除的数据
delete from student_new where StuName=@StuName
print '数据删除成功'
end

使用示例7:创建DDL触发器,禁止删除或修改数据库中的表,并提示禁止修改或删除

create trigger trig_schoolDB_denyalterdrop
on database
after drop_table,alter_table
as
print '禁止修改或删除数据库中的表'
rollback



3.修改触发器

语法格式:

--重命名触发器
exec sp_rename <原触发器名>,<新触发器名>

--修改触发器内容
ALTER TRIGGER <触发器名>
ON <数据表|视图|DATABASE>
<AFTER|FOR|INSTEAD OF><触发事件>
AS
<触发动作体>

使用示例:修改DDL触发器,允许删除或修改数据库中的表,并提示禁止修改或删除,但已修改成功

alter trigger trig_schoolDB_denyalterdrop
on database
after drop_table,alter_table
as
print '禁止修改或删除数据库中的表,但已修改成功'



4.禁用启用触发器

语法格式:

--禁用DML触发器
DISABLE TRIGGER <触发器名> ON <表|视图>
--禁用DDL触发器trig_schoolDB_denyalterdrop
DISABLE TRIGGERtrig_schoolDB_denyalterdrop ON DATABASE
--启用DML触发器
ENABLE TRIGGER <触发器名> ON <表|视图>
--启用DDL触发器trig_schoolDB_denyalterdrop
ENABLE TRIGGER trig_schoolDB_denyalterdrop ON DATABASE

使用示例:

--禁用student表中的DML触发器trig_student_delete 
DISABLE TRIGGER trig_student_delete ON student
--禁用DDL触发器
DISABLE TRIGGER <触发器名> ON DATABASE
--启用student表中的DML触发器trig_student_delete 
ENABLE TRIGGER trig_student_delete ON student
--启用DDL触发器
ENABLE TRIGGER <触发器名> ON DATABASE



5.删除触发器

语法格式:

DROP TRIGGER <触发器名>

使用示例:删除student表中的DML触发器trig_student_delete

drop trigger trig_student_delete 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章