- 語法
[ @triggername = ] '[ triggerschema. ] triggername'
, [ @order = ] 'value'
, [ @stmttype = ] 'statement_type'
[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]
- 引數
- [ @triggername= ] '[ triggerschema.]triggername':TriggerSchema 和 TriggerName
- 無法設定 INSTEAD OF Triiger 的觸發順序
- DDL Trigger 和 LOGON Trigger 不能指定 TriggerSchema
- value 為 varchar(10)
- 第一個和最後一個 Trigger 必須不同的 Trigger
- 可以是下列其中任何一個值
值 說明 First 最先引發觸發程序。 Last 最後引發觸發程序。 None 觸發程序的引發,沒有任何既定順序。
- statement_type 為 varchar(50)
- 可以是 INSERT、UPDATE、DELETE、LOGON 或 DDL 事件中所列的任何 T-SQL,但不能指定事件群組
- DML Trigger:不需要指定或指定為 NULL
- DDL Trigger:指定使用資料庫範圍或伺服器範圍來建立
- LOGON Trigger:必須指定 SERVER
- 在 TempDB 內 Demo 一下 DML Triiger 設定觸法順序
USE TempDB
GO
IF OBJECT_ID('dbo.TriggerOrder') IS NOT NULL
DROP TABLE dbo.TriggerOrder
CREATE TABLE dbo.TriggerOrder (ID int)
GO
CREATE Trigger dbo.tr1 ON dbo.TriggerOrder
FOR INSERT
AS
PRINT 'Trigger1 觸發'
GO
CREATE Trigger dbo.tr2 ON dbo.TriggerOrder
FOR INSERT
AS
PRINT 'Trigger2 觸發'
GO
CREATE Trigger dbo.tr3 ON dbo.TriggerOrder
FOR INSERT
AS
PRINT 'Trigger3 觸發'
GO
CREATE Trigger dbo.tr4 ON dbo.TriggerOrder
FOR INSERT
AS
PRINT 'Trigger4 觸發'
GO
利用 INSERT 進行第一次觸發 Trigger,可以觀察從 Trigger 中 Print 出來的文字INSERT INTO TriggerOrder VALUES(1)
利用 sp_settriggerorder 把 tr4 順序設為 First、 tr4 順序設為 LastEXEC sp_settriggerorder
@triggername = 'tr4',
@order = 'First',
@stmttype = 'INSERT',
@namespace = NULL
GO
EXEC sp_settriggerorder
@triggername = 'tr1',
@order = 'Last',
@stmttype = 'INSERT' ,
@namespace = NULL
GO
再次 INSERT 資料來觸發 Trigger,可以發現 tr4 變成第一個觸發,而 tr1 變成最後被觸發,而 tri2 和 tri3 則是無法保證其觸發順序。INSERT INTO TriggerOrder VALUES(2)
結論:千萬不要設計 Table 內的 Trigger 有觸發順序,免得搞死自己。- 2013 DBA 天團試題
沒有留言:
張貼留言