2016-04-04 13 views
1

için SQL Server tetikleyicisi Tablo EditingField_Poly ve sütun Send_Email 'Evet' için 'Hayır' için düzenlemeye çalışıyorum. Düzenlemeyi kaydetmeme izin vermiyor ... Tetiği kapattığımda, kaydetmeme izin veriyor. Bu tetikleyici, yeni ekleme olup olmadığını veya bu 2 sütun için herhangi bir güncelleştirilmiş olup olmadığını görecektir - eğer varsa, Send_Email sütununda "Hayır" dan "Evet" e kadar olan durumu değiştirecekEklemek veya güncelleştirilmiş

Birisi bana yardım edebilir Bu tetiği yanlış yaptı? o Inserted tek bir satır varsayar çünkü

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[Send_Email] 
ON [dbo].[EDITINGFIELD_POLY] 
FOR UPDATE, INSERT 
AS 
    IF (UPDATE([Status]) or UPDATE([Department])) 
    BEGIN 
      SET NOCOUNT ON; 

      DECLARE @OID int; 
      SELECT @OID = i.OBJECTID from inserted i; 

      UPDATE [dbo].[EDITINGFIELD_POLY] 
      SET Send_Email = 'Yes' 
      WHERE OBJECTID = @OID    
END 
GO 
+0

tablo yapısını gönderebilir? – Philipp

+0

'Send_Email 'alanını _only_ ayarlıyor musunuz yoksa" SET "bölümünde ayarlanmış çok sayıda alan var mı? "Durum" veya "Departman", "SET" maddesinde bulunuyorsa, değerleriniz değişmese bile tetikleyiciniz ateşlenir. –

+0

"Düzenlemeyi kaydetmesine izin vermiyor" ile ne demek istiyorsun? Herhangi bir hata veya mesaj alıyor musunuz? – AKS

cevap

1

Kişisel tetik ağır kusurlu - bu her zaman böyle değildir. INSERT veya UPDATE işleminiz birden çok satırı etkiliyorsa, tetikleyici tüm ifade için yalnızca bir kez olarak adlandırılır ve sözde tablolar çoklu satırlar!

Bu bilgi ile çalışmanız ve tam set tabanlı modayı tetikleyiniz - SELECT @OID = Inserted.ObjectID stil kodunu kullanmayınız! Ayrıca

, iki satır biri değişip değişmediğini UPDATE durumda kontrol ediyoruz, çünkü kolayca kombine tetikleyici bunu yapamaz - İki ayrı tetikler, INSERT için bir, UPDATE için birini kullanarak öneriyoruz.

bu deneyin:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[trg_Send_Email_Update] 
ON [dbo].[EDITINGFIELD_POLY] 
FOR UPDATE 
AS 
    UPDATE [dbo].[EDITINGFIELD_POLY] 
    SET Send_Email = 'Yes' 
    FROM Inserted i 
    INNER JOIN Deleted d ON i.OBJECTID = d.OBJECTID 
    WHERE [dbo].[EDITINGFIELD_POLY].OBJECTID = i.OBJECTID 
     AND (d.Status <> i.Status OR d.Department <> i.Department) 
GO 

ALTER TRIGGER [dbo].[trg_Send_Email_Insert] 
ON [dbo].[EDITINGFIELD_POLY] 
FOR INSERT 
AS 
    UPDATE [dbo].[EDITINGFIELD_POLY] 
    SET Send_Email = 'Yes' 
    FROM Inserted i 
    WHERE [dbo].[EDITINGFIELD_POLY].OBJECTID = i.OBJECTID 
GO 
+0

OBJECTID'im PK ise ne olur? – Lanna

+0

@ Lanna: Yanıtımımı yeni güncelledim - sadece ilk tetikleyiciye ufak bir değişiklik yaptım.Yalnızca iyi çalışmalıyım –

+0

Bunu yaptım ve "END" yok ve bana şu hatayı veriyor: 209, Seviye 16, Durum 1, Prosedür trg_Send_Email_Update Satır 10 Belirsiz sütun adı 'OBJECTID' – Lanna

İlgili konular