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 



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