觸發器觸發時,系統自動在內存中建立deleted表或inserted表,內存中建立的表只讀,不容許修改,觸發器執行完成後,自動刪除。sql
insert觸發器工做原理:第一步執行insert插入語句,在表中插入數據行,第二步觸發insert觸發器,向系統臨時表insert表中插入新行的備份(副本),第三部觸發器檢查insert表中插入的新行數據,肯定是否要回滾或執行其餘操做。數據庫
不能使用SSMS數據庫管理工具直接建立DML添加觸發器,能夠使用T-SQL腳本建立DML添加觸發器。安全
--聲明數據庫引用
use 數據庫名;
go服務器
--判斷是否存在觸發器,若是存在則刪除
if exists(select * from sysobjects where name=觸發器名)
drop trigger 觸發器名;
go架構
--建立插入觸發器
create
trigger --觸發器標識符
--DML 觸發器所屬架構的名稱。 DML 觸發器的做用域是爲其建立該觸發器的表或視圖的架構。 不能爲 DDL 或登陸觸發器指定
[架構名稱.] 觸發器名 --觸發器的名稱app
--對其執行 DML 觸發器的表或視圖,有時稱爲觸發器表或觸發器視圖。 能夠根據須要指定表或視圖的徹底限定名稱。 視圖只能被 INSTEAD OF 觸發器引用。 不能對局部或全局臨時表定義 DML 觸發器。
on [架構名稱.] { 表名 | 視圖名 }工具
with
--對 CREATE TRIGGER 語句的文本進行模糊處理。使用WITH ENCRYPTION能夠防止將觸發器做爲SQL Server複製的一部分進行發佈。不能爲 CLR 觸發器指定 WITH ENCRYPTION。
encryption,性能
--指示觸發器已本機編譯。 (只能應用於table)
--內存優化表上的觸發器須要使用此選項。
--native_compilation,優化
--確保不能刪除或更改觸發器引用的表。 (只能應用於table)
--內存優化表上的觸發器須要使用此選項,但此選項不支持傳統表上的觸發器。
schemabindingspa
--EXECUTE AS
--指定用於執行該觸發器的安全上下文。 容許您控制 SQL Server 實例用於驗證被觸發器引用的任意數據庫對象的權限的用戶賬戶。
--內存優化表上的觸發器須要使用此選項。
--execute as clause
--FOR | AFTER
--AFTER 指定 DML 觸發器僅在觸發 SQL 語句中指定的全部操做都已成功執行時才被觸發。 全部的引用級聯操做和約束檢查也必須在激發此觸發器以前成功完成。
--若是僅指定 FOR 關鍵字,則 AFTER 爲默認值。
--不能對視圖定義 AFTER 觸發器。
{ for | after }
--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定數據修改語句,這些語句可在 DML 觸發器對此表或視圖進行嘗試時激活該觸發器。 必須至少指定一個選項。 在觸發器定義中容許使用上述選項的任意順序組合。
--對於 INSTEAD OF 觸發器,不容許對具備指定級聯操做 ON DELETE 的引用關係的表使用 DELETE 選項。 一樣,也不容許對具備指定級聯操做 ON UPDATE 的引用關係的表使用 UPDATE 選項。
{ [insert] [,] [update] [,] [delete] }
--指定應該再添加一個現有類型的觸發器。 WITH APPEND 不能與 INSTEAD OF 觸發器一塊兒使用。若是顯式聲明瞭 AFTER 觸發器,則也不能使用該子句。
--僅當爲了向後兼容而指定了 FOR 時(但沒有 INSTEAD OF 或 AFTER)時,才能使用 WITH APPEND。 若是指定了 EXTERNAL NAME(即觸發器爲 CLR 觸發器),則不能指定 WITH APPEND。
--with append
--指示當複製代理修改涉及到觸發器的表時,不該執行觸發器。
--not for replication
as
begin
sql_statement
end
go
--聲明數據庫引用
use testss;
go
--判斷是否存在觸發器,若是存在則刪除
if exists(select * from sysobjects where name='inserttri')
drop trigger inserttri;
go
--建立插入觸發器
create
trigger --觸發器標識符
--[dbo.] --DML 觸發器所屬架構的名稱。 DML 觸發器的做用域是爲其建立該觸發器的表或視圖的架構。 不能爲 DDL 或登陸觸發器指定
dbo.inserttri --觸發器的名稱
on dbo.test1 --對其執行 DML 觸發器的表或視圖,有時稱爲觸發器表或觸發器視圖。 能夠根據須要指定表或視圖的徹底限定名稱。 視圖只能被 INSTEAD OF 觸發器引用。 不能對局部或全局臨時表定義 DML 觸發器。
with
--對 CREATE TRIGGER 語句的文本進行模糊處理。使用WITH ENCRYPTION能夠防止將觸發器做爲SQL Server複製的一部分進行發佈。不能爲 CLR 觸發器指定 WITH ENCRYPTION。
encryption,
--指示觸發器已本機編譯。 (只能應用於table)
--內存優化表上的觸發器須要使用此選項。
--native_compilation,
--確保不能刪除或更改觸發器引用的表。 (只能應用於table)
--內存優化表上的觸發器須要使用此選項,但此選項不支持傳統表上的觸發器。
schemabinding
--EXECUTE AS
--指定用於執行該觸發器的安全上下文。 容許您控制 SQL Server 實例用於驗證被觸發器引用的任意數據庫對象的權限的用戶賬戶。
--內存優化表上的觸發器須要使用此選項。
--execute as clause
--FOR | AFTER
--AFTER 指定 DML 觸發器僅在觸發 SQL 語句中指定的全部操做都已成功執行時才被觸發。 全部的引用級聯操做和約束檢查也必須在激發此觸發器以前成功完成。
--若是僅指定 FOR 關鍵字,則 AFTER 爲默認值。
--不能對視圖定義 AFTER 觸發器。
for
--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定數據修改語句,這些語句可在 DML 觸發器對此表或視圖進行嘗試時激活該觸發器。 必須至少指定一個選項。 在觸發器定義中容許使用上述選項的任意順序組合。
--對於 INSTEAD OF 觸發器,不容許對具備指定級聯操做 ON DELETE 的引用關係的表使用 DELETE 選項。 一樣,也不容許對具備指定級聯操做 ON UPDATE 的引用關係的表使用 UPDATE 選項。
insert
--指定應該再添加一個現有類型的觸發器。 WITH APPEND 不能與 INSTEAD OF 觸發器一塊兒使用。若是顯式聲明瞭 AFTER 觸發器,則也不能使用該子句。
--僅當爲了向後兼容而指定了 FOR 時(但沒有 INSTEAD OF 或 AFTER)時,才能使用 WITH APPEND。 若是指定了 EXTERNAL NAME(即觸發器爲 CLR 觸發器),則不能指定 WITH APPEND。
--with append
--指示當複製代理修改涉及到觸發器的表時,不該執行觸發器。
--not for replication
as
begin
declare @names nvarchar(50)=null;
set @names=(select top(1) name from dbo.test1 order by id desc );
if(select @names) is not null
begin
insert into dbo.test2(name) values(@names);
end
end
go
優勢:
一、在新增時能夠實現比約束更爲嚴格的約束檢查。
二、能夠實現表之間複雜的業務邏輯關聯。
三、能夠實現數據插入時自動添加日誌表記錄。
缺點:
一、可移植性差。
二、佔用服務器資源,給服務器形成壓力。
三、執行速度主要取決於數據庫服務器的性能與觸發器代碼的複雜程度。