只有當新增記錄時帶有特定旗標(如 IdFlag = 1)才記錄日誌,否則靜默插入。
-- 主表
CREATE TABLE wTblTestExt (
AutoId INT IDENTITY PRIMARY KEY,
CSName CHAR(10) NOT NULL DEFAULT (''),
IdFlag SMALLINT NOT NULL DEFAULT (0) -- 0=不記錄, 1=記錄日誌
)
-- 日誌表
CREATE TABLE wTblTestExtLog (
AutoId INT NOT NULL DEFAULT (0),
CSName CHAR(10) NOT NULL DEFAULT ('')
)
CREATE TRIGGER wTblTestExt_InsAndLock
ON dbo.wTblTestExt
FOR INSERT
AS
BEGIN
DECLARE @LockFlag TINYINT
SELECT @LockFlag = IdFlag FROM inserted
IF @LockFlag = 1
BEGIN
INSERT INTO wTblTestExtLog (AutoId, CSName)
SELECT AutoId, CSName FROM inserted
END
END
| 測試語句 | IdFlag | 預期結果 |
|---|---|---|
INSERT INTO wTblTestExt (CSName) VALUES ('Michael') | 0 (預設) | 主表有資料,日誌表無新增 |
INSERT INTO wTblTestExt (CSName, IdFlag) VALUES ('Michael', 1) | 1 | 主表、日誌表同步新增 |
inserted 虛擬表僅包含本次觸發的新增列inserted 含多列,**需用集合操作而非單變數賦值**
CREATE TRIGGER wTblTestExt_InsAndLock
ON dbo.wTblTestExt
FOR INSERT
AS
BEGIN
INSERT INTO wTblTestExtLog (AutoId, CSName)
SELECT AutoId, CSName
FROM inserted
WHERE IdFlag = 1
END
此版本自動過濾 IdFlag=1 的列,支援單列/批次混合插入,邏輯更簡潔健壯。
UPDATE(IdFlag) 或比對 inserted/deleteddeleted 讀取旗標決定是否歸檔TinyInt 位元掩碼,控制多種副作用(日誌、通知、同步等)AutoId 非叢集索引加速查詢