SQLServer之创建AFETER DELETE触发器
DML AFTER DELETE觸發(fā)器創(chuàng)建原理
觸發(fā)器觸發(fā)時,系統(tǒng)自動在內(nèi)存中創(chuàng)建deleted表或inserted表,inserted表臨時保存了插入或更新后的記錄行,deleted表臨時保存了刪除或更新前的記錄行,內(nèi)存中創(chuàng)建的表只讀,不允許修改,觸發(fā)器執(zhí)行完成后,自動刪除。
delete觸發(fā)器工作原理:第一步執(zhí)行delete刪除語句,刪除表中的數(shù)據(jù)行,第二步觸發(fā)delete刪除觸發(fā)器,向系統(tǒng)臨時表的deleted表中插入被刪除的副本,第三步觸發(fā)器檢查deleted中被刪除的數(shù)據(jù),確定是否需要回滾或執(zhí)行其他操作。
不能使用SSMS數(shù)據(jù)庫管理工具直接創(chuàng)建DML添加觸發(fā)器,可以使用T-SQL腳本創(chuàng)建DML添加觸發(fā)器。
DML AFTER DELETE觸發(fā)器創(chuàng)建
語法:
--聲明數(shù)據(jù)庫引用
use 數(shù)據(jù)庫名;
go
--判斷是否存在觸發(fā)器,如果存在則刪除
if exists(select * from sysobjects where name=觸發(fā)器名)
drop trigger 觸發(fā)器名;
go
----創(chuàng)建新的刪除觸發(fā)器
create
--觸發(fā)器標(biāo)識符
trigger
--DML 觸發(fā)器所屬架構(gòu)的名稱。 DML 觸發(fā)器的作用域是為其創(chuàng)建該觸發(fā)器的表或視圖的架構(gòu)。 不能為 DDL 或登錄觸發(fā)器指定
--[dbo.]
--觸發(fā)器名稱
[架構(gòu)名.]觸發(fā)器名
on
--對其執(zhí)行 DML 觸發(fā)器的表或視圖,有時稱為觸發(fā)器表或觸發(fā)器視圖。 可以根據(jù)需要指定表或視圖的完全限定名稱。 視圖只能被 INSTEAD OF 觸發(fā)器引用。 不能對局部或全局臨時表定義 DML 觸發(fā)器。
[架構(gòu)名.]{ table | view}
with
--對CREATE TRIGGER 語句的文本進行模糊處理。使用WITH ENCRYPTION可以防止將觸發(fā)器作為SQL Server復(fù)制的一部分進行發(fā)布。不能為 CLR 觸發(fā)器指定 WITH ENCRYPTION。(指定此選項將為觸發(fā)器加密)
[encryption][,]
--指示觸發(fā)器已本機編譯。 (只能應(yīng)用于table)
--內(nèi)存優(yōu)化表上的觸發(fā)器需要使用此選項。
[native_compilation][,]
--確保不能刪除或更改觸發(fā)器引用的表。(只能應(yīng)用于table)
--內(nèi)存優(yōu)化表上的觸發(fā)器需要使用此選項,但此選項不支持傳統(tǒng)表上的觸發(fā)器。
[schemabinding][,]
--EXECUTE AS (后面可以跟函數(shù),存儲過程等)
--指定用于執(zhí)行該觸發(fā)器的安全上下文。 允許您控制 SQL Server 實例用于驗證被觸發(fā)器引用的任意數(shù)據(jù)庫對象的權(quán)限的用戶帳戶。
--內(nèi)存優(yōu)化表上的觸發(fā)器需要使用此選項。
[execute as clause]
--FOR | AFTER
--AFTER 指定 DML 觸發(fā)器僅在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行時才被觸發(fā)。 所有的引用級聯(lián)操作和約束檢查也必須在激發(fā)此觸發(fā)器之前成功完成。
--如果僅指定 FOR 關(guān)鍵字,則 AFTER 為默認值。
--不能對視圖定義 AFTER 觸發(fā)器。
{ for | after}
--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定數(shù)據(jù)修改語句,這些語句可在 DML 觸發(fā)器對此表或視圖進行嘗試時激活該觸發(fā)器。 必須至少指定一個選項。 在觸發(fā)器定義中允許使用上述選項的任意順序組合。
--對于 INSTEAD OF 觸發(fā)器,不允許對具有指定級聯(lián)操作 ON DELETE 的引用關(guān)系的表使用 DELETE 選項。 同樣,也不允許對具有指定級聯(lián)操作 ON UPDATE 的引用關(guān)系的表使用 UPDATE 選項。
{ [insert] [,] [update] [,] [delete] }
--指定應(yīng)該再添加一個現(xiàn)有類型的觸發(fā)器。 WITH APPEND 不能與 INSTEAD OF 觸發(fā)器一起使用。如果顯式聲明了 AFTER 觸發(fā)器,則也不能使用該子句。?
--僅當(dāng)為了向后兼容而指定了 FOR 時(但沒有 INSTEAD OF 或 AFTER)時,才能使用 WITH APPEND。 如果指定了 EXTERNAL NAME(即觸發(fā)器為 CLR 觸發(fā)器),則不能指定 WITH APPEND。
--with append
--指示當(dāng)復(fù)制代理修改涉及到觸發(fā)器的表時,不應(yīng)執(zhí)行觸發(fā)器。
--not for replication
as
begin
sql_statement
end
end ;
go
示例:
--聲明數(shù)據(jù)庫引用
use testss;
go
--判斷是否存在觸發(fā)器,如果存在則刪除
if exists(select * from sysobjects where name='deletetri')
drop trigger deletetri;
go
----創(chuàng)建新的刪除觸發(fā)器
create
--觸發(fā)器標(biāo)識符
trigger
--DML 觸發(fā)器所屬架構(gòu)的名稱。 DML 觸發(fā)器的作用域是為其創(chuàng)建該觸發(fā)器的表或視圖的架構(gòu)。 不能為 DDL 或登錄觸發(fā)器指定
--[dbo.]
--觸發(fā)器名稱
dbo.deletetri
on
--對其執(zhí)行 DML 觸發(fā)器的表或視圖,有時稱為觸發(fā)器表或觸發(fā)器視圖。 可以根據(jù)需要指定表或視圖的完全限定名稱。 視圖只能被 INSTEAD OF 觸發(fā)器引用。 不能對局部或全局臨時表定義 DML 觸發(fā)器。
dbo.test1
with
--對CREATE TRIGGER 語句的文本進行模糊處理。使用WITH ENCRYPTION可以防止將觸發(fā)器作為SQL Server復(fù)制的一部分進行發(fā)布。不能為 CLR 觸發(fā)器指定 WITH ENCRYPTION。(指定此選項將為觸發(fā)器加密)
encryption,
--指示觸發(fā)器已本機編譯。 (只能應(yīng)用于table)
--內(nèi)存優(yōu)化表上的觸發(fā)器需要使用此選項。
--native_compilation
--確保不能刪除或更改觸發(fā)器引用的表。(只能應(yīng)用于table)
--內(nèi)存優(yōu)化表上的觸發(fā)器需要使用此選項,但此選項不支持傳統(tǒng)表上的觸發(fā)器。
schemabinding
--EXECUTE AS (后面可以跟函數(shù),存儲過程等)
--指定用于執(zhí)行該觸發(fā)器的安全上下文。 允許您控制 SQL Server 實例用于驗證被觸發(fā)器引用的任意數(shù)據(jù)庫對象的權(quán)限的用戶帳戶。
--內(nèi)存優(yōu)化表上的觸發(fā)器需要使用此選項。
--execute as clause
--FOR | AFTER
--AFTER 指定 DML 觸發(fā)器僅在觸發(fā) SQL 語句中指定的所有操作都已成功執(zhí)行時才被觸發(fā)。 所有的引用級聯(lián)操作和約束檢查也必須在激發(fā)此觸發(fā)器之前成功完成。
--如果僅指定 FOR 關(guān)鍵字,則 AFTER 為默認值。
--不能對視圖定義 AFTER 觸發(fā)器。
for
--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定數(shù)據(jù)修改語句,這些語句可在 DML 觸發(fā)器對此表或視圖進行嘗試時激活該觸發(fā)器。 必須至少指定一個選項。 在觸發(fā)器定義中允許使用上述選項的任意順序組合。
--對于 INSTEAD OF 觸發(fā)器,不允許對具有指定級聯(lián)操作 ON DELETE 的引用關(guān)系的表使用 DELETE 選項。 同樣,也不允許對具有指定級聯(lián)操作 ON UPDATE 的引用關(guān)系的表使用 UPDATE 選項。
delete
as
begin
declare @sss nvarchar(100)=null;
set @sss=(select top(1) name from deleted order by id desc)
if @sss is not null
begin
delete from dbo.test2 where id=(select id from dbo.test2 where name=@sss);
end
end ;
go
示例結(jié)果:
DML AFTER DELETE觸發(fā)器優(yōu)缺點
優(yōu)點:
1、實現(xiàn)數(shù)據(jù)的級聯(lián)刪除操作。
2、不需要參數(shù),不需要顯示調(diào)用。
缺點:
1、如果不知道表中存在刪除器,刪除表中數(shù)據(jù)會造成不必要的級聯(lián)操作,造成數(shù)據(jù)丟失。
2、可移植性差。
3、占用服務(wù)器資源,給服務(wù)器造成壓力。
4、執(zhí)行速度主要取決于數(shù)據(jù)庫服務(wù)器的性能與觸發(fā)器代碼的復(fù)雜程度。
5、觸發(fā)器會使編程時源碼的結(jié)構(gòu)被迫打亂,為將程序修改、源碼閱讀帶來困難。
轉(zhuǎn)載于:https://www.cnblogs.com/vuenote/p/9776810.html
總結(jié)
以上是生活随笔為你收集整理的SQLServer之创建AFETER DELETE触发器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle中sysdba身份和dba角
- 下一篇: 【HDU 5834】Magic boy