首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL Server 觸發器不支援 Oracle 的「AFTER INSERT OR UPDATE」語法

     編輯:程式設計疑難解答

差異對比

特性OracleSQL Server
多事件合併支援 AFTER INSERT OR UPDATE OR DELETE ON table不支援,需建立分離觸發器
行級觸發FOR EACH ROW 原生支援無 FOR EACH ROW,預設為語句級,需用 inserted/deleted 虛擬表模擬行級邏輯
觸發時機BEFORE / AFTER / INSTEAD OFAFTER / INSTEAD OF (無 BEFORE)

SQL Server 正確寫法

建立兩個獨立觸發器:

-- 插入觸發器
CREATE TRIGGER tr_table_insert
ON target_table
AFTER INSERT
AS
BEGIN
    -- 處理 inserted 虛擬表資料
END;

-- 更新觸發器
CREATE TRIGGER tr_table_update
ON target_table
AFTER UPDATE
AS
BEGIN
    -- 處理 inserted / deleted 虛擬表資料
END;

行級邏輯實現技巧

CREATE TRIGGER tr_example
ON my_table
AFTER INSERT, UPDATE  -- SQL Server 允許在單一觸發器指定多事件,但內部仍需判斷
AS
BEGIN
    IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
        -- UPDATE 操作
    ELSE IF EXISTS (SELECT * FROM inserted)
        -- INSERT 操作
    -- 逐行處理需配合 CURSOR 或集合式操作
END;

遷移建議

  • 將 Oracle 行級邏輯改寫為集合式 INSERTED/DELETED 表操作,效能更佳。
  • 複雜業務建議移至儲存程序 或應用層,觸發器僅做最小化動作(審計、同步)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved