Sql Server Trigger Kullanımı

Home  >>  Sql Server  >>  Sql Server Trigger Kullanımı

Sql Server Trigger Kullanımı

10
Eki,2014

0
Trigger(tetikleyici) update,delete,insert gibi işlemler sonrasında devreye girerek bu tetikleme işlemiyle ilgii bize yeni eventlar oluşturmamıza olanak sağlar. Trigger oluşumları 2 ayrı tabloda tutulmaktadır. 1. Tablo inserted anlaşılacağı gibi bu tablo da insert olan kayıtlar tutulmaktır. 2.Tablomuz delected bu tabloda update ve delete işlemleri ilgli kayıtlar tutulmaktadır. senaryomuz, Tedarikçiden gelen ürünlerimizin çeki listelerinin yüklendiği bir palet tablomuz olsun, Ürünlerimizin stok hareketlerini tutuğumuz farklı bir tablomuz da insert , update ve delete işlemleri oluştuğunda ürünlere atadığımız referans aracılığıyla belirlediğimiz bir depoda ürünün güncel mevcut miktarını Palet Tablomuzda da güncelleyeceğimiz bir triger oluşturalım. tetiklenecek olan Stok Hareket tablomuzda triggerımızı yazmaya başlayalım,
USE [MustafaDemircioglu_DataTest]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[AcleUpd_BarkodPalet] ON [dbo].[M3_Stok_HarFis_Detay]
AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
SET NOCOUNT ON; 
DECLARE @Stok varchar(40)
    DECLARE @SthD_PartiNo varchar(40)
    DECLARE @SthD_SeriNo varchar(40)
    DECLARE @SthD_Stok varchar(50) 
    DECLARE @SthD_Turu varchar(10)
    DECLARE @SthD_Miktar float 
    DECLARE @Depo varchar (20)
    DECLARE @StokCinsi varchar (30)
    
    
    -- Sabit değerlerimiz
    SET @Depo='02'
    SET @StokCinsi ='KİMYASAL'

	
	--Delete , Update işlemlerimiz
	DECLARE CRS_AcleUpd_BarkodPalet CURSOR FOR 
		   SELECT  SthD_Stok,SthD_PartiNo,SthD_SeriNo,SthD_Turu FROM deleted 
	OPEN CRS_AcleUpd_BarkodPalet
	--deleted tablomuz içerisinde ürünlere while ile tek tek ulaşıyoruz.
	FETCH NEXT FROM CRS_AcleUpd_BarkodPalet INTO  @SthD_Stok,@SthD_PartiNo, @SthD_SeriNo ,@SthD_Turu
    WHILE @@FETCH_STATUS = 0
		BEGIN
		
			SET @SthD_Miktar=(Select Sum((CASE Left(SthD_Turu,3) WHEN 'ALM' THEN SthD_Miktar1 ELSE SthD_Miktar1 * -1 END)) 
			From M3_Stok_HarFis_Detay with(nolock,Index(Std_KeyStkDepPrtSeri)) 
			Where SthD_Stok=@SthD_Stok And SthD_PartiNo=@SthD_PartiNo And SthD_SeriNo=@SthD_SeriNo AND SthD_Depo=@Depo)
			if @SthD_Miktar is NULL SET @SthD_Miktar=0
	
	-- Turumuz alım irsaliye işlemi ise bu türe bir ayrıcalık tanımlayıp irsaliyeler zaten ilk işlemler deyip bu türü es geçiyoruz		
	IF @SthD_Turu <> 'ALM2IRS' BEGIN
	
	-- Turumuz ALM2IRS değilse Palet Tablomuzu güncelliyoruz.
	UPDATE [M3_Barkod_Palet]
		SET
		Bpl_Miktar1 =@SthD_Miktar
		FROM [M3_Barkod_Palet] X JOIN [M3_Stok_Kart] Y ON X.Bpl_Stok = Y.St_Kod
		WHERE 
				Y.St_Kod=@SthD_Stok
		  AND	Y.St_OzelAlan03=@StokCinsi
		  AND	X.Bpl_PartiNo = @SthD_PartiNo
		  AND	X.Bpl_SeriNo = @SthD_SeriNo
	 END			
		
	    FETCH NEXT FROM CRS_AcleUpd_BarkodPalet INTO @SthD_Stok,@SthD_PartiNo, @SthD_SeriNo,@SthD_Turu
	END
   Close CRS_AcleUpd_BarkodPalet
   DEALLOCATE CRS_AcleUpd_BarkodPalet
   
   
    --insert işlemlerimiz
	DECLARE CRS_AcleUpd_BarkodPalet CURSOR FOR 
		   SELECT  SthD_Stok,SthD_PartiNo,SthD_SeriNo FROM inserted 
	OPEN CRS_AcleUpd_BarkodPalet
	--inserted tablomuz içerisindeki ürünlere tek tek ulaşıyoruz.
	FETCH NEXT FROM CRS_AcleUpd_BarkodPalet INTO @SthD_Stok, @SthD_PartiNo, @SthD_SeriNo
	WHILE @@FETCH_STATUS = 0
		BEGIN
		
		    -- İlgili referans numaralı ürünümüzün tablo stok mevcutunu buluyoruz
			SET @SthD_Miktar=(Select Sum((CASE Left(SthD_Turu,3) WHEN 'ALM' THEN SthD_Miktar1 ELSE SthD_Miktar1 * -1 END)) 
			From M3_Stok_HarFis_Detay with(nolock,Index(Std_KeyStkDepPrtSeri))
			 Where SthD_Stok=@SthD_Stok And SthD_PartiNo=@SthD_PartiNo And SthD_SeriNo=@SthD_SeriNo AND SthD_Depo=@Depo)
			
			-- Eğer @SthD_Miktar boş gelirse diye önlemimizi alıyoruz.
			if @SthD_Miktar is NULL SET @SthD_Miktar=0
			--Palet Tablomuzu güncelliyoruz.
					UPDATE [M3_Barkod_Palet]
				SET
				Bpl_Miktar1 =@SthD_Miktar
				FROM [M3_Barkod_Palet] X JOIN [M3_Stok_Kart] Y ON X.Bpl_Stok = Y.St_Kod
				WHERE 
						Y.St_Kod=@SthD_Stok
				  AND	Y.St_OzelAlan03=@StokCinsi
				  AND	X.Bpl_PartiNo = @SthD_PartiNo
				  AND	X.Bpl_SeriNo = @SthD_SeriNo
		  
	    FETCH NEXT FROM CRS_AcleUpd_BarkodPalet INTO  @SthD_Stok,@SthD_PartiNo, @SthD_SeriNo
	END
   Close CRS_AcleUpd_BarkodPalet
   DEALLOCATE CRS_AcleUpd_BarkodPalet

END

Software Developer Mustafa Demircioğlu www.mustafademircioglu.net www.mustafademircioglu.org mustafa.demircioglu@outlook.com

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir