防止開發人員或維護人員在未加 WHERE 條件的情況下,誤執行大量 UPDATE 或 DELETE 陳述式,導致資料異動過多造成業務影響。透過 DML Trigger 在資料庫層面攔截超過閾值的異動操作。
CREATE TRIGGER tr_tblTime
ON tblTime
FOR UPDATE, DELETE
AS
BEGIN
IF ORIGINAL_LOGIN() IN ('wind', 'snow')
AND (SELECT COUNT(*) FROM deleted) > 10
BEGIN
RAISERROR('Serious error, please contact the DBA', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END
END
GO
| 元素 | 說明 |
|---|---|
FOR UPDATE, DELETE | 僅針對 UPDATE 與 DELETE 操作觸發 |
ORIGINAL_LOGIN() | 取得原始登入帳號,不受 EXECUTE AS 影響 |
deleted 虛擬表 | 儲存被刪除或更新前的舊資料列 |
COUNT(*) > 10 | 判斷異動筆數是否超過 10 筆 |
RAISERROR + ROLLBACK | 拋出錯誤並回滾交易 |
⚠ 注意: Trigger 會在每次 DML 操作時執行,若該表頻繁進行大量異動,會顯著影響效能。建議: