2016-11-18 1 views
3

Wenn ein Trigger ausgeführt wird, ist es möglich, eine unterschiedliche Anzahl von Zeilen in eingefügten und gelöschten Tabellen ungleich Null zu haben (im Grunde eine Mischung aus Einfügung und Aktualisierungen, die zur gleichen Zeit behandelt werden)?Ist es immer möglich, gemischte Updates und Einfügungen im selben Trigger-Lauf zu haben?

Zum Beispiel könnte die eingefügte Tabelle 2 Zeilen haben und delete hätte 1 Zeile (entspricht 1 der eingefügten Zeilen) und dies würde bedeuten, dass der Trigger eine Mischung aus 1 Update behandelt (die übereinstimmenden Zeilen in eingefügten und gelöschten Tabellen)) und 1 Einsatz.

aktualisieren

Anscheinend ist der Einsatz von merge Befehl 1 Trigger verursachen könnten für alle Änderungen vorgenommen laufen, sehen: Merge statement and after triggers on target table Oder auch nicht, dies testen müssen.

Nach https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ die merge Befehle verursacht Auslöser mehrmals ausgeführt werden, Aktualisierungen und Einfügungen zu trennen.

Lösung Aktualisieren

this Unter der Annahme, ist die gesamte Liste der DML Aktionen dann wird es nie der Fall sein, wenn es gemischt Einfügungen und Aktualisierungen in dem gleichen Trigger Laufe behandelt werden.

Antwort

1

Nein, das ist nicht möglich.

Sie können sehen, wie es von unten funktioniert.

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); 

Das gibt zwei Resultsets zurück. Eine für die Einfügung und eine für das Update.

enter image description here

+0

ich in der Frage festgestellt, dass es nicht für 'merge' Befehl funktioniert. Sind Sie sicher, dass es absolut keinen Umstand gibt, in dem ein Auslöser möglicherweise Aktualisierungen und Einfügungen gemischt hat? –

+1

@ RazvanPanda - Ja. Die einzigen anderen Sprachelemente, die neben der Zusammenführung ausgelöst werden, sind insert, update, delete. Daher ist es schwierig zu verstehen, warum Sie sich vorstellen, dass dies der Fall sein könnte. löscht Feuer pro Anweisung und jede Anweisung außer der Zusammenführung kann nur eine Aktion ausführen. –

+0

Es kann jedoch auch andere Fälle geben. Ich werde auf andere Antworten warten müssen, bevor ich stimme/akzeptiere, um mehr cetaintly zu bekommen. Außerdem müssen Sie mehr Dinge selbst ausprobieren. –

Verwandte Themen