因故需要 全部停用(DISABLE):資料庫內的 DML 觸發程序(Trigger)
停用範圍,包含:AFTER 觸發程序、INSTEAD OF 觸發程序
效益是優化效能,經由停用 DML 觸發程序(Trigger),讓新增、修改與刪除(INSERT、UPDATE、DELETE)資料的速度更快。
舉例來講,可應用於:測試用資料庫、複寫(Replication)機制訂閱者端(Subscriber)的資料庫等。
可以使用以下 T-SQL 陳述式達成
-- 全部停用:資料庫內的 DML 觸發程序(DML Trigger) USE UserDB GO EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL" GO
本範例是全部停用:資料庫內的 DML 觸發程序(Trigger),
包含:AFTER 觸發程序、INSTEAD OF 觸發程序
DML 觸發程序
當使用者試圖透過資料操作語言 (DML) 事件來修改資料時,便會執行 DML 觸發程序。
DML 事件包括資料表或檢視的 INSERT、UPDATE 或 DELETE 陳述式。
當引發任何有效的事件時,都會引發這些觸發程序,不論是否有任何資料表資料列受到影響。
全部停用資料庫內的 DML 觸發程序(Trigger)
示範如下
USE AdventureWorks2014 GO -- 01_查詢:資料庫內的 DML 觸發程序(DML Trigger)的相關狀態 SELECT s.name N'結構描述',o.name N'資料表', t.name N'觸發程序名稱', t.is_disabled N'已停用(1)', tEV.type_desc '引發觸發程序的每個事件', is_instead_of_trigger N'INSTEAD OF 觸發程序(1)', t.type_desc N'物件類型的描述', parent_class_desc N'觸發程序父類別的描述' FROM sys.triggers t INNER JOIN sys.trigger_events tEV ON t.object_id = tEV.object_id INNER JOIN sys.objects o ON t.parent_id = o.object_id INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE parent_class_desc = 'OBJECT_OR_COLUMN' AND o.type='U' ORDER BY s.name GO -- 全部停用:資料庫內的 DML 觸發程序(DML Trigger) USE AdventureWorks2014 GO EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL" GO -- 全部啟用:資料庫內的 DML 觸發程序(DML Trigger) USE AdventureWorks2014 GO EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL" GO
-- 001_查詢資料庫內的觸發程序

-- 002_全部停用:資料庫內的 DML 觸發程序(DML Trigger)

-- 003_查詢資料庫內的觸發程序_全部停用

-- 004_全部啟用:資料庫內的 DML 觸發程序(DML Trigger)

-- 005_全部啟用:資料庫內的 DML 觸發程序(DML Trigger)

-- 006_查詢資料庫內的觸發程序_全部啟用

SSMS 停用單一觸發程序
-- 010_SSMS_觸發程序已啟用

-- 012_可以停用觸發程序

-- 013_已停用此觸發程序

-- 014_可以啟用此觸發程序

-- 015_已啟用此觸發程序

參考文件
[SQL Server][Replication]:複寫使用者正在插入至 NOT FOR REPLICATION 識別欄位時...遭遇錯誤
http://sharedderrick.blogspot.tw/2017/06/sql-serverreplication-not-for.html
DISABLE TRIGGER (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/ms189748.aspx
停用(Disable)與啟用(Enable)「觸發程序(Trigger)」
http://sharedderrick.blogspot.tw/2010/09/disableenabletrigger.html
停用複寫的檢查條件約束
https://msdn.microsoft.com/zh-tw/library/ms190235.aspx
唯一條件約束與檢查條件約束
https://msdn.microsoft.com/zh-tw/library/ms187550.aspx#Check
沒有留言:
張貼留言