inserted:INSERT/UPDATE 的新行。deleted:DELETE/UPDATE 的舊行。-- 創建
CREATE TRIGGER trg_Name
ON TableOrView
{ AFTER | INSTEAD OF } { INSERT, UPDATE, DELETE }
AS BEGIN ... END;
-- 修改
ALTER TRIGGER trg_Name ... (同創建)
-- 刪除
DROP TRIGGER trg_Name;
-- 查看所有觸發器
SELECT name, parent_class_desc, create_date, modify_date
FROM sys.triggers;
-- 查看單個定義
EXEC sp_helptext 'trg_Name';
-- 或
SELECT OBJECT_DEFINITION(OBJECT_ID('trg_Name'));
sp_settriggerorder 設置首/尾/無序)。若約束違反,AFTER 觸發器不執行;INSTEAD OF 可在約束前處理數據使其通過。
CREATE TRIGGER trg_Order_BlockOnProcessing
ON Orders
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT 1 FROM inserted i
JOIN Goods g ON g.Name = i.GoodsName
WHERE g.Status = 1 -- 整理中
)
BEGIN
RAISERROR('商品整理中,無法下單', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END
END;
CREATE TRIGGER trg_Order_DeductStock
ON Orders
AFTER INSERT
AS
BEGIN
UPDATE g
SET g.Stock = g.Stock - i.Qty
FROM Goods g
JOIN inserted i ON g.Name = i.GoodsName;
END;
CREATE TRIGGER trg_Goods_CascadeDelete
ON Goods
AFTER DELETE
AS
BEGIN
DELETE o FROM Orders o
JOIN deleted d ON o.GoodsName = d.Name;
END;
CREATE TRIGGER trg_Order_ProtectDate
ON Orders
AFTER UPDATE
AS
BEGIN
IF UPDATE(OrderDate)
BEGIN
RAISERROR('訂單日期不可修改', 16, 1);
ROLLBACK TRANSACTION;
END
END;
CREATE TRIGGER trg_Order_ValidateGoods
ON Orders
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT 1 FROM inserted i
LEFT JOIN Goods g ON g.Name = i.GoodsName
WHERE g.Name IS NULL
)
BEGIN
RAISERROR('商品不存在', 16, 1);
ROLLBACK TRANSACTION;
END
END;
ALTER TRIGGER trg_Order_SyncExternal
ON Orders
FOR INSERT
AS
BEGIN
INSERT INTO ExternalOrder (Id, GoodsName, Qty)
SELECT Id, GoodsName, Qty FROM inserted;
END;
SET NOCOUNT ON。sys.dm_exec_trigger_stats 統計執行次數/耗時,定期審計。