2016-11-18 51 views
3

當觸發器正在運行時,可能在插入和刪除的表中有非零的不同行數(基本上是同時處理插入和更新的混合)?是否有可能在相同的觸發器運行中混合更新並插入?

例如,插入的表可能有2行,刪除將有1行(匹配插入的行中的1行),這意味着觸發器正在處理1個更新的混合(插入和刪除表中的匹配行)和1個插入。

更新

顯然使用 merge命令可能導致1個觸發對所做的所有更改運行,請參閱: Merge statement and after triggers on target table還是不行,需要測試這一點。

根據https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ merge命令導致觸發器多次運行,分隔更新和插入。

解決方案更新

假設this是DML操作的完整列表,然後絕不會有時會出現混合插入和在同一個觸發器的運行處理更新的情況。

回答

1

不,這是不可能的。

你可以從下面看到它是如何工作的。

CREATE TABLE T1 
    (
    X INT 
) 

INSERT INTO T1 
VALUES  (1); 

GO 

CREATE TRIGGER TR 
ON T1 
FOR UPDATE, INSERT 
AS 
    SELECT (SELECT COUNT(*) 
      FROM inserted) AS InsertedCount, 
      (SELECT COUNT(*) 
      FROM deleted) AS DeletedCount 

GO 

MERGE INTO T1 
USING (VALUES (1), 
       (2), 
       (3)) V(X) 
ON T1.X = V.X 
WHEN MATCHED THEN 
    UPDATE SET X = V.X 
WHEN NOT MATCHED THEN 
    INSERT (X) 
    VALUES (X); 

其中返回兩個結果集。一個用於插入,一個用於更新。

enter image description here

+0

我的問題,它不適合'merge'命令工作人員表示。你確定觸發器可能有混合更新和插入的絕對情況嗎? –

+1

@RăzvanPanda - 是的。除了合併之外,觸發器唯一的其他語言元素是插入,更新,刪除,所以很難理解爲什麼你會想象它們可能會導致這種情況。觸發每條語句觸發,除合併之外的每個語句只能執行一個操作。 –

+0

雖然可能有其他情況。 我必須等待其他答案,然後才能投票/接受更清晰的答案。另外,需要自己嘗試更多的事情。 –

相關問題