單一觸發器處理 INSERT/UPDATE/DELETE 時,透過 inserted 與 deleted 虛擬表是否有資料判斷操作類型:
| 操作 | inserted | deleted | 判斷條件 |
|---|---|---|---|
| INSERT | 有資料 (新資料) | 無資料 | EXISTS(inserted) AND NOT EXISTS(deleted) |
| DELETE | 無資料 | 有資料 (舊資料) | EXISTS(deleted) AND NOT EXISTS(inserted) |
| UPDATE | 有資料 (新資料) | 有資料 (舊資料) | EXISTS(inserted) AND EXISTS(deleted) |
CREATE TRIGGER tr_T_A ON T_A
FOR INSERT, UPDATE, DELETE
AS
BEGIN
-- 判斷 INSERT
IF EXISTS (SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted)
BEGIN
PRINT 'INSERT 操作';
-- 插入邏輯
END
-- 判斷 UPDATE
ELSE IF EXISTS (SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted)
BEGIN
PRINT 'UPDATE 操作';
-- 更新邏輯:inserted = 新值, deleted = 舊值
END
-- 判斷 DELETE
ELSE IF EXISTS (SELECT 1 FROM deleted) AND NOT EXISTS (SELECT 1 FROM inserted)
BEGIN
PRINT 'DELETE 操作';
-- 刪除邏輯
END
END
CREATE TRIGGER [risk].[Entry_Head_port_Exchange_Trigger]
ON [RiskH800].[risk].[ENTRY_HEAD]
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @COUNT INT, @MANUAL_NO_COUNT INT;
-- UPDATE 情況:inserted 與 deleted 都有資料
IF EXISTS (SELECT 1 FROM INSERTED) AND EXISTS (SELECT 1 FROM DELETED)
BEGIN
SELECT @COUNT = COUNT(*)
FROM risk.ENTRY_HEAD_port_EXCHANGE
WHERE ENTRY_ID = (SELECT ENTRY_ID FROM DELETED);
SELECT @MANUAL_NO_COUNT = COUNT(MANUAL_NO)
FROM DELETED
WHERE SUBSTRING(MANUAL_NO,1,1) IN ('B','C');
IF @COUNT <= 0 AND @MANUAL_NO_COUNT > 0
INSERT INTO risk.ENTRY_HEAD_port_EXCHANGE (ENTRY_ID, CREATE_DATE)
SELECT ENTRY_ID, GETDATE() FROM DELETED;
END
-- INSERT 情況:只有 inserted 有資料
ELSE IF EXISTS (SELECT 1 FROM INSERTED)
BEGIN
SELECT @COUNT = COUNT(*)
FROM risk.ENTRY_HEAD_port_EXCHANGE
WHERE ENTRY_ID = (SELECT ENTRY_ID FROM INSERTED);
SELECT @MANUAL_NO_COUNT = COUNT(MANUAL_NO)
FROM INSERTED
WHERE SUBSTRING(MANUAL_NO,1,1) IN ('B','C');
IF @COUNT <= 0 AND @MANUAL_NO_COUNT > 0
INSERT INTO risk.ENTRY_HEAD_port_EXCHANGE (ENTRY_ID, CREATE_DATE)
SELECT ENTRY_ID, GETDATE() FROM INSERTED;
END
END
= (SELECT ...),改用 JOIN 或 INIF UPDATE(ColumnName) 判斷單一欄位SET NOCOUNT ON 減少網路往返