ekrem özer

her yerde olan şeyler.

Sql Trigger Kullanımı

Trigger'ın Türkçe anlamı tetikleyicidir. Yani bir tabloda değişiklik yapıldığı zaman diğer tabloyu da istediğimiz şekilde otomatik olarak güncellemektedir. Üç farklı çeşidi vardır.

  1. Insert Trigger
  2. Update Trigger
  3. Delete Trigger

Insert Trigger

Örneğin bir satış işleminde satış tablosuna insert işlemi yaptığımız zaman aynı zamanda ürünler tablomuzdan da ilgili ürünün stokunu revize etmemizi sağlayan trigger'ımızı yazalım.

CREATE TRIGGER StokGuncelle ON Satislar
FOR INSERT
AS BEGIN
DECLARE @UrunId INT, @SatisAdedi INT 
SELECT @UrunId = UrunId, @SatisAdedi = Adet FROM INSERTED
UPDATE Urunler SET StokAdedi=StokAdedi-@SatisAdedi WHERE ID=@UrunId 
END

Yukarıdaki kodumuzu inceleyelim; 1. Satırda, Yeni bir trigger oluşturmak için create trigger diyoruz, triggerımızın adını yazıyoruz ve satislar tablosunda ekleme olduğu anda bir kod blogu çalışacağı için on Satislar yazıyoruz. 2 . Satırda Trigger çesitimizi belirtiyoruz. Satislar tablosunda herhangi bir ekleme işlemi olduğu anda sql server “inserted” adında bir tablo oluşturur. Bu tablonun adını veya yerini değiştiremeyiz. 3.Satırda, Kodlarımızı yazacağımız blogu açıyoruz. 4.Satırda urunid ve satisadedi adında int türünde 2 tane değişken tanımladık. 5.Satırda Sql serverın arka planda oluşturduğu inserted tablosundan tanımladığımız değişkenlere değerlerini atıyoruz. 6.Satırda diğer tabloda (bizim için Urunler tablosu) yapılması gereken değişikliği sorgu biçiminde yazıyoruz. Sorgumuzda urunler tablosundaki StokAdedi'nin girdiğimiz satisadedi kadar azalmasını sağlıyoruz. Tabi ki daha sonra where koşulu ile bunun satışını yaptığımız üründe gerçekleşmesini sağlıyoruz. 7.Satırda kod bloğumuzu sonlandırıyoruz. Yukarıdaki kodumuzla Trigger'ımızı oluşturduk şimdi bir üründe test edelim. Aşağıdaki ürünün stok adedi 5

Siparişler tablomuza veri girişi yapıyoruz, Laptoptan 2 adet satış giriyoruz.

INSERT INTO Satislar (UrunId, Adet) VALUES (1, 2)

Tekrar ürünler tabloma baktığımda Laptop'un stoğu 2 adet azalmış oluyor.

Delete Trigger

Yukarıdaki örnekten devam edecek olursak, oluşturduğumuz siparişi sildiğimiz zaman sipariş adedi kadar ilgili ürünün stoğu artması gerekir. Şimdi bu işlemi yapacak trigger'ımızı yazalım.

CREATE TRIGGER SiparisIptali ON Satislar
FOR DELETE
AS
BEGIN
DECLARE @UrunId INT, @SatisAdedi INT
SELECT @UrunId = ID, @SatisAdedi = Adet FROM DELETED
UPDATE Urunler SET StokAdedi = StokAdedi + @SatisAdedi WHERE ID=@UrunId
END

Yukarıdaki kodumuzu inceleyelim; 1. Satırda, Yeni bir trigger oluşturmak için create trigger diyoruz, triggerımızın adını yazıyoruz ve satislar tablosunda ekleme olduğu anda bir kod blogu çalışacağı için on Satislar yazıyoruz. 2 . Satırda Trigger çesidimizi belirtiyoruz. Satislar tablosunda herhangi bir ekleme işlemi olduğu anda sql server “delete” adında bir tablo oluşturur. Bu tablonun adını veya yerini değiştiremeyiz. 3.Satırda, Kodlarımızı yazacağımız bloğu açıyoruz. 4.Satırda urunid ve satisadedi adında int türünde 2 tane değişken tanımladık. 5.Satırda Sql serverın arka planda oluşturduğu delete tablosundan tanımladığımız değişkenlere değerlerini atıyoruz. 6.Satırda diğer tabloda (bizim için Urunler tablosu) yapılması gereken değişikligi sorgu biçiminde yazıyoruz. Sorgumuzda urunler tablosundaki StokAdedi'nin sildiğimiz siparişteki ürün adedi kadar artmasını sağlıyoruz. Tabi ki daha sonra where koşulu ile bunun satışını yaptığımız üründe gerçekleşmesini sağlıyoruz. 7.Satırda kod bloğumuzu sonlandırıyoruz. Yukarıdaki kodumuzla Trigger'ımızı oluşturduk şimdi bir üründe test edelim. Aşağıdaki ürünün stok adedi 3

Update Trigger

Yine yukarıdaki örnekten devam edecek olursak yaptığımız satışın adedini güncelleyelim. 2 adet Laptop satışını 1 adete düşürelim. Ben bir önceki anlatımda sildiğim satışı tekrar ekliyorum. Şimdi bu işlemi yapacak trigger'ımızı yazalım.

CREATE TRIGGER SiparisGuncelle ON Satislar
FOR UPDATE
AS
BEGIN
DECLARE @UrunId int, @EskiSatisAdedi INT, @YeniSatisAdedi INT, @Fark INT
SELECT @UrunId = UrunId, @EskiSatisAdedi = Adet FROM DELETED
SELECT @YeniSatisAdedi = Adet FROM INSERTED
SET @Fark = @YeniSatisAdedi - @EskiSatisAdedi
UPDATE Urunler SET StokAdedi = StokAdedi - @Fark WHERE ID=@UrunId
END

1. Satırda, Yeni bir trigger oluşturmak için create trigger diyoruz, triggerımızın adını yazıyoruz ve satislar tablosunda ekleme olduğu anda bir kod blogu çalışacağı için on Satislar yazıyoruz.

2. Satırda Trigger çeşidimizi belirtiyoruz. Satislar tablosu üzerinde herhangi bir güncelleme olduğu anda çalışacaktır. Burada bilmeniz gereken update triggerin insert ve delete triggerdan biraz daha farklı çalışmasıdır. Triggerda direk bir güncelleme işlemi olmaz. Güncelleme yapabilmek için önce güncellenen tabloyu siler ve daha sonra güncellenmiş şekli ile tabloyu tekrar ekler.

3.Satırda, Kodlarımızı yazacağımızz blogu açıyoruz.

4.Satırda urunİd, eskisatisadedi, yenisatisadedi, fark adında int türünden 4 adet değişken tanımladık.

5. Satırda Yukarıda da belirttiğimiz gibi önce silme işlemi yapıyoruz ve silinen tablodan eski satis adedini olusturduğumuz değişkene atıyoruz.

6. Satırda insert tablosundan güncellenen satış adedini yenisatisadedi adlı değişkene aktarıyoruz.

7. Satırda Yeni satış adedinden eski satış adedini çıkartarak aradaki farkı fark adlı değişkene aktarıyoruz.

8. Satırda Urunler tablosundaki ürün adedini aradaki fark kadar azaltıyoruz. Tabi ki yine where koşulu ile hangi üründe değişiklik yapılacağını belirtiyoruz.

Yukarıdaki kodumuzla Trigger'ımızı oluşturduk şimdi bir üründe test edelim. Aşağıdaki ürünün stok adedi 3

Satışlar tablosundaki siparişin ürün adedini güncelliyorum,

UPDATE Satislar SET Adet = 1 WHERE UrunId = 1

Görüldüğü gibi ürün adedimiz 1 adet artmış.

Trigger Güncelleme/Silme

Object Explorer'dan aşağıdaki yolu izleyerek trigger'ımızın üzerine sağ tık yapıyoruz. Silmek istersek Delete düzenlemek istersek Modify seçeneğine tıklıyoruz.

Modify'e tıkladıktan sonra karşımıza Trigger kodlarımız çıkacaktır.

Buradan istediğimiz değişikliği yapıp Execute'e tıklıyoruz. Bir sonraki makalede görüşmek üzere, umarım faydalı olmuştur.