INSERT 觸發器:攔截特定學號插入
CREATE TRIGGER tri_insert
ON student
FOR INSERT
AS
BEGIN
DECLARE @student_id CHAR(10);
SELECT @student_id = s.student_id
FROM student s INNER JOIN inserted i ON s.student_id = i.student_id;
IF @student_id = '0000000001'
BEGIN
RAISERROR('不能插入 1 的學號!', 16, 8);
ROLLBACK TRAN;
END
END;
GO
UPDATE 觸發器:禁止修改學號
CREATE TRIGGER tri_update
ON student
FOR UPDATE
AS
BEGIN
IF UPDATE(student_id)
BEGIN
RAISERROR('學號不能修改!', 16, 8);
ROLLBACK TRAN;
END
END;
GO
DELETE 觸發器:保護管理員帳號不被刪除
CREATE TRIGGER tri_delete
ON student
FOR DELETE
AS
BEGIN
DECLARE @student_id VARCHAR(10);
SELECT @student_id = student_id FROM deleted;
IF @student_id = 'admin'
BEGIN
RAISERROR('錯誤', 16, 8);
ROLLBACK TRAN;
END
END;
GO
關鍵技術點總結
| 觸發器類型 | 虛擬表 | 常用檢查函數 | 典型應用 |
| INSERT | inserted | JOIN inserted 比對新值 | 資料驗證、自動編碼、審計日誌 |
| UPDATE | inserted, deleted | UPDATE(column_name) | 欄位變更攔截、歷史追蹤、防惡意修改 |
| DELETE | deleted | 直接查詢 deleted | 關鍵資料保護、級聯刪除檢查、軟刪除實作 |
最佳實務提醒
- 觸發器屬同一交易,避免長時間運算或外部呼叫 造成封鎖
- 使用
SET NOCOUNT ON 減少網路傳輸
- 多重觸發器順序可用
sp_settriggerorder 設定
- INSTEAD OF 觸發器可替代基表操作,實現複雜視圖更新