首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

MSSQL 觸發器條件執行:旗標欄位控制邏輯實作

     編輯:關於SqlServer

需求場景

只有當新增記錄時帶有特定旗標(如 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/deleted
  • 刪除觸發器:從 deleted 讀取旗標決定是否歸檔
  • 複雜業務旗標:可擴充為 TinyInt 位元掩碼,控制多種副作用(日誌、通知、同步等)

效能提示

  • 觸發器內避免複雜查詢、游標、跨資料庫操作
  • 日誌表建議加 AutoId 非叢集索引加速查詢
  • 高頻寫入場景考慮異步寫入(Service Broker / 變更追蹤 / CDC)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved