2017-07-10 20 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