2017-07-10 49 views
1

我將創建更新觸發器。此觸發器的用途是,如果muadurum列已更改,請將表中的舊值mua_tarih插入表fkayitlar並插入到另一個表mua_tarihleri用於更新的MSSQL觸發器僅工作一次

我的代碼塊喜歡;

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 

取舊值;

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

取新值;

SELECT @mua_durum_sonra=muayenedurum FROM inserted 

檢查值是否改變;如果改變,插入@mua_tarih表mua_tarihleri@kisi_id@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 

我的問題是當我在表fkayitlar更新多行,觸發工作,但我只看到一張插入的行在表mua_tarihleri(僅工作一次)。我需要看到不止一個(應該不止一次地工作)觸發器是否在多個進程上工作?我該如何解決這個問題?

+2

當表被更新,無論有多少行是如何更新觸發只發生一次。因此,你必須編寫你的觸發器體來操作一組行,而不是像你所做的那樣對一行進行操作。 –

+0

「已刪除」是一個虛擬表,即可以包含多行。刪除三行的單個刪除語句會使觸發器中的「已刪除」表有三行。考慮到這一點,你應該很好。 –

+0

@ƉiamondǤeezeƦ**更新fkayitlar SET muayenedurum ='OLMADI',muayenetarih = NULL在哪裏GETDATE()> periyodiktarih **當我運行這個查詢時,多於一行受到影響,並且它們都必須插入表中** mua_tarihleri * *但它不能工作:( – BozkurtFuat

回答

1

只有在更新表時觸發器纔會出現一次,無論有多少行被更新。因此,你必須編寫你的觸發器體來操作一組行,而不是像你所做的那樣對一行進行操作。

應該是這樣的:

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

感謝您的迴應:)它現在工作。我很感激。 – BozkurtFuat