2017-07-10 2 views
1

Ich werde einen Trigger für das Update erstellen. Zweck dieses Triggers ist, dass wenn Muadurum Spalte geändert wird, nehmen Sie den alten Wert von mua_tarih in Tabelle fkayitlar und fügen Sie zu einer anderen Tabelle mua_tarihleri ​​.MSSQL Trigger für Update funktioniert nur einmal

Mein Codeblock wie;

ALTER TRIGGER [dbo].[trgr_fkayit_update] 
ON [dbo].[fkayitlar] 
AFTER UPDATE 
AS 
DECLARE @mua_durum_once NVARCHAR(10) 
DECLARE @mua_durum_sonra NVARCHAR(10) 
DECLARE @mua_tarih_once DATE 
DECLARE @mua_yapan_once NVARCHAR(25) 
DECLARE @kisi_id INT 

Nehmen Sie den alten Wert;

SELECT 
@kisi_id=kayitid, 
@mua_durum_once=muayenedurum, 
@mua_tarih_once=muayenetarih, 
@mua_yapan_once=mua_yapan 
FROM deleted 

Nehmen Sie den neuen Wert;

SELECT @mua_durum_sonra=muayenedurum FROM inserted 

Überprüfen, ob der Wert geändert wurde; wenn geändert, Legen @mua_tarih Tabelle mua_tarihleri ​​ mit @kisi_id und @mua_yapan_once

IF @mua_durum_once='OLDU' 
    AND @mua_durum_sonra='OLMADI' 
    AND @mua_tarih_once IS NOT NULL 
    BEGIN 
    INSERT INTO mua_tarihleri(kayitid,mua_tarihi,mua_yapan) 
     VALUES(@kisi_id,@mua_tarih_once,@mua_yapan_once) 
    END 

Mein Problem ist, wenn ich mehr als eine Zeile in der Tabelle fkayitlar aktualisieren, wird Trigger-Arbeit, aber ich sehe nur eine eingefügte Reihe in der Tabelle mua_tarihleri ​​ (funktioniert nur einmal). Ich muss mehr als einen sehen (sollte mehr als einmal funktionieren) Sind Trigger nicht an mehr als einem Prozess beteiligt? oder Wie kann ich das mein Problem lösen?

+2

Der Auslöser nur einmal auftritt, wenn die Tabelle aktualisiert wird, unabhängig davon, wie viele Zeilen aktualisiert werden. Daher müssen Sie Ihren Trigger-Body so schreiben, dass er in einer Reihe von Zeilen arbeitet, nicht in einer Zeile, wie Sie es getan haben. –

+0

"deleted" ist eine virtuelle Tabelle, d. H. Kann mehrere Zeilen enthalten. Eine einzelne Löschanweisung, die drei Zeilen löscht, führt dazu, dass die "gelöschte" Tabelle in einem Auslöser drei Zeilen hat. Berücksichtigen Sie dies und Sie sollten gut sein. –

+0

@ ƉiamondǤeezeƦ ** AKTUALISIEREN fkayitlar SET muayenedurum = 'OLMADI', muayenetarih = NULL WHERE GETDATE()> periyodiktarih ** Wenn ich diese Abfrage ausführe, wird mehr als eine Zeile bewirkt, und alle müssen in die Tabelle eingefügt werden ** mua_tarihleri ​​* * aber es kann nicht funktionieren :( – BozkurtFuat

Antwort

1

Der Trigger tritt nur einmal auf, wenn die Tabelle aktualisiert wird, unabhängig davon, wie viele Zeilen aktualisiert werden. Daher müssen Sie Ihren Trigger-Body so schreiben, dass er in einer Reihe von Zeilen arbeitet, nicht in einer Zeile, wie Sie es getan haben.

Sollte so etwas wie:

ALTER TRIGGER [dbo].[trgr_fkayit_update] 
ON [dbo].[fkayitlar] 
AFTER UPDATE 
AS 
    INSERT INTO mua_tarihleri(kayitid,mua_tarihi,mua_yapan) 
    SELECT deleted.kayitid, deleted.muayenedurum, deleted.muayenetarih, deleted.mua_yapan 
    FROM deleted 
    JOIN inserted ON deleted.kayitid = inserted.kayitid 
    WHERE deleted.muayenedurum='OLDU' 
     AND inserted.muayenedurum='OLMADI' 
     AND muayenetarih IS NOT NULL 
+0

Danke für Ihre Antwort :) es funktioniert jetzt. Ich habe es geschätzt. – BozkurtFuat