webentwicklung-frage-antwort-db.com.de

WENN UPDATE () im SQL Server-Trigger

Wenn es gibt:

IF UPDATE (col1)

... gibt der SQL-Server-Trigger für eine Tabelle nur dann true zurück, wenn col1 geändert oder aktualisiert wurde?

Ich habe regelmäßig eine Update-Abfrage

UPDATE table-name 
   SET col1 = 'x', 
       col2 =  'y' 
 WHERE id = 999

Nun, was ist mein Anliegen, wenn "col1" vorher "x" war, dann haben wir es erneut auf "x" aktualisiert Würde IF UPDATE ("col1") auslösen, True zurückgeben oder nicht?

Ich stehe vor diesem Problem, da meine Speicherabfrage generisch für alle Spalten ist. Wenn ich jedoch diese Bedingung hinzufüge, wird True zurückgegeben, auch wenn sie nicht geändert wird. Daher bin ich besorgt, was in diesem Fall zu tun ist, wenn ich eine solche Bedingung hinzufügen möchte ?

28
Jason M

Wenn eine Spalte aktualisiert wurde, wird true zurückgegeben. Ein Update bedeutet, dass für die Abfrage der Wert der Spalte SET ist. Ob der vorherige Wert der gleiche war wie der neue Wert, ist weitgehend unerheblich.

UPDATE table SET col = col

es ist ein Update.

UPDATE table SET col = 99

wenn die Spalte bereits 99 hatte, ist es auch ein Update.

43
Remus Rusanu

Innerhalb des Triggers haben Sie Zugriff auf zwei interne Tabellen, die helfen können. Die 'eingefügte' Tabelle enthält die neue Version jeder betroffenen Zeile. Die 'gelöschte' Tabelle enthält die ursprüngliche Version jeder Zeile. Sie können die Werte in diesen Tabellen vergleichen, um zu sehen, ob Ihr Feldwert tatsächlich geändert wurde.

10
Ray

Was Sie tun, ist, nach unterschiedlichen Werten in den eingefügten und gelöschten Tabellen zu suchen, anstatt update () zu verwenden. Oder Sie könnten aufhören, nicht mehr benötigte Updates durchzuführen.

2
HLGEM

Hier finden Sie eine schnelle Methode zum Durchsuchen der Zeilen, um festzustellen, ob sich ANY-Spalten geändert haben, bevor Sie den Inhalt eines Triggers ausführen. Dies kann beispielsweise nützlich sein, wenn Sie einen Verlaufsdatensatz schreiben möchten, dies jedoch nicht tun möchten, wenn sich nichts geändert hat.

Dies wird in ETL-Importprozessen immer dann verwendet, wenn Daten möglicherweise erneut importiert werden. Wenn sich in der Quelldatei jedoch nichts geändert hat, möchten wir keinen neuen Verlaufsdatensatz erstellen.

CREATE TRIGGER [dbo].[TR_my_table_create_history]
ON [dbo].[my_table] FOR UPDATE AS

BEGIN

    --
    -- Insert the old data row if any column data changed
    --
    INSERT INTO [my_table_history]
    SELECT  d.*
    FROM    deleted d
    INNER JOIN inserted i ON i.[id] = d.[id]
    --
    -- Use INTERSECT to see if anything REALLY changed
    --
    WHERE   NOT EXISTS( SELECT i.* INTERSECT SELECT d.* )

END

Beachten Sie, dass dieser bestimmte Trigger davon ausgeht, dass Ihre Quelltabelle (die den Trigger auslöst) und die Protokolltabelle identische Spaltenlayouts haben.

2
Bruce Pierson

Um den Fall "Kein tatsächliches Update" zu kürzen, müssen Sie am Anfang auch prüfen, ob Ihre Abfrage überhaupt Zeilen hatte:

set nocount on; -- this must be the first statement!
if not exists (select 1 from inserted) and not exists (select 1 from deleted)
  return;
1
Oliver
cREATE TRIGGER boo  ON status2 FOR UPDATE AS 
IF UPDATE (id)
BEGIN
SELECT 'DETECT'; 
END;

UPDATE status2 SET name = 'K' WHERE name= 'T' --no action 
UPDATE status2 SET name = 'T' ,id= 8 WHERE name= 'K' --detect
1
zloctb
SET NOCOUNT ON;

    declare @countTemp int
    select @countTemp = Count (*) from (
    select City,PostCode,Street,CountryId,Address1 from Deleted
    union
    select City,PostCode,Street,CountryId,Address1 from Inserted
    ) tempTable

    IF ( @countTemp > 1 )

Begin

-- Your Code goes Here
End

-- if any of these  "City,PostCode,Street,CountryId,Address1" got updated then trigger

-- will  work in " IF ( @countTemp > 1 ) " Code)
0
Shyam Sharma