SQL Server : Trigger hangi kipte çalışıyor

Created with Sketch.

SQL Server : Trigger hangi kipte çalışıyor

Siz de benim gibi bazı hesaplamaları veritabanına kaydetme sırasında yapmayı sevenlerdenseniz veya böyle bir ihtiyacınız varsa sıklıkla bu işleri Trigger’ler üzerinden halletmeniz gerekir.

SQL Server’de bir Trigger’in hangi modda olduğunu o an için bize söyleyen bir işlev yok. Bunu öğrenebilmek için INSERTED ve DELETED tablolarının dolu olup olmadığına bakmanız ve bir çıkarsama yapmanız gerekir. Bu işi kolaylaştıran bir fonksiyon yazmıştım, sizlerle paylaşmanın faydalı olacağına inanıyorum;

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      
-- Create date: <16.12.2014 12:46>
-- Description:  
-- =============================================
--CREATE FUNCTION dbo.fn_triggerkipi
 ALTER FUNCTION dbo.fn_triggerkipi
 ( @InsertedCount  INT = 0 -->  Örnek (SELECT TOP 1 COUNT(*) FROM INSERTED)
 , @DeletedCount   INT = 0 -->  Örnek (SELECT TOP 1 COUNT(*) FROM DELETED)
 )
RETURNS VARCHAR(8)
AS  BEGIN
   RETURN
   CASE
     WHEN @InsertedCount > 0 AND @DeletedCount = 0 THEN 'ekle'      --> INSERT Kipidir, DELETED tablosu boş gelir...
     WHEN @InsertedCount > 0 AND @DeletedCount > 0 THEN 'değiştir'  --> UPDATE Kipidir, Her iki tablo da doludur... DELETED tablosu önceki veriyi, INSERTED ise yeni veriyi tutar...
     WHEN @InsertedCount = 0 AND @DeletedCount > 0 THEN 'sil'       --> DELETE Kipidir, INSERTED tablosu boş gelir...
     ELSE 'yok'                                                     --> Hiçbiri       , Her iki tablo da boştur... (Ki aslında parametre hatalıysa böyle bir durum oluşur)
   END;
END

Kullanımı oldukça basittir ve genel anlamda sık sık trigger’ler ile uğraşıyorsanız bu bahsettiğim adımı basite indirgemenizde size yardımcı olacaktır.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author      : 
-- Create date : <2017-02-20>
-- Description : <...>
-- =============================================
ALTER TRIGGER  [dbo].[TRG_Ajanda]
         ON  [dbo].[Ajanda]
FOR INSERT, DELETE, UPDATE
AS  BEGIN
   
   SET NOCOUNT ON;
   
   DECLARE @TRG_Durum  VARCHAR(8) = dbo.fn_triggerkipi( (SELECT TOP 1 COUNT(*) FROM INSERTED), (SELECT TOP 1 COUNT(*) FROM DELETED) )
   
   IF (@TRG_Durum = 'ekle')
   or (@TRG_Durum = 'değiştir') BEGIN

       UPDATE  X
       SET     X.Taslak = ISNULL(I.Taslak, 0)
       FROM    dbo.Ajanda    as  X      LEFT OUTER
       JOIN    INSERTED      as  I  on  I.Ref = X.Ref
       WHERE   X.Ref in (SELECT DISTINCT Ref FROM INSERTED)
       ;
   END ELSE
   IF (@TRG_Durum = 'sil') BEGIN
       SET NOCOUNT ON; --> bu satırın yerine silme işlemi sırasında bir log tutuyorsanız ilgili kodlarınızı bu noktaya yazabilirsiniz...
   END
END

Görüldüğü gibi 17. satırda (@TRG_Durum) değişkenine hangi modda çalıştığı işleniyor ve devamındaki IF bloğunda da mevcut duruma göre SQL kodlarınızı birbirine karıştırmadan yazabiliyorsunuz.

 

Yorum yapılmamış

Yorumunuzu ekleyin