17 Ocak 2017 Salı

Trigger Oluşturmak

Genel olarak bir trigger oluşturma ifadesi şu şekildedir.
CREATE TRIGGER trigger_adı
ON tablo_adı
     {FOR AFTER/INSTEAT OF}    
     {INSERT/UPDATE/DELETE}
AS
      Çalışacak olan SQL ifadeleri


Örnek: Bir satış yapıldığı zaman stokta eğer ürün varsa otomatik olarak stoktan düşen, yoksa uyarı mesajı veren bir trigger yazalım.
Bu işlem için  öncelikle aşağıdaki tabloları oluşturmamız gerekir.
Müşteriler
Kitaplar
Satışlar
Bu tablolara ait nitelikler ve SQL ifadeleri şöyledir.

Müşteriler tablosu ve nitelikleri aşağıdaki SQL kodu ile birlikte verilmektedir. Bu kodları SQL Server’da bir Query oluşturarak yazıp derleriz.



Ürünler tablosu ve nitelikleri aşağıdaki SQL kodu ile birlikte verilmektedir. Bu kodları SQL Server’da bir Query oluşturarak yazıp derleriz.


Son olarak satışlar tablosu ve nitelikleri aşağıdaki SQL kodu ile birlikte verilmektedir. Bu kodları SQL Server’da bir Query oluşturarak yazıp derleriz.

Oluşturduğumuz bu tablolara aşağıdaki gibi kayıtlar ekleyelim.

Tüm gerekli işlemlerin ardından herhangi bir satış yapıldığında stok miktarına bağlı olarak gerekli işlemleri yapacak olan trigger’ımız şöyle olacaktır.
Birinci kısımda bir trigger oluşturmak için CREATER TRIGGER komutunu ve bu trigger’ın hangi tablo üzerinde işlem yapacağını, ardından FOR INSERT ile bu trigger’ın bir ekleme işleminin ardından çalışacağını belirttik.

Burada müşteri numarası 1 olan kişi, 2 numaralı üründen 1 adet sipariş vermektedir.

Benzer şekilde satışlar tablosunda bir kayıt silindiğinde (iptal edildiğinde) çalışacak olan bir DELETE trigger’ı yazalım. DELETE trigger’ı için SQL ifademiz şöyle olacaktır.


Bu trigger ise satış sonrası fatura kesildikten sonra teslim edilen ürünleri silmek için kullanılabilir. Silinen kayıtlar daha önceden bahsettiğimiz gibi DELETED tablosunda tutulmaktadır.
Ayrıca bu trigger iptal edilen (yani ürünler tablosundan silinen) ürün adedini tekrar ürünler tablosuna eklemektedir.





Bu trigger’ıda çalıştırmak için SQL ifademiz şöyle olacaktır.


Benzer şekilde UPDATE trigger’ı ise aşağıdaki gibi olacaktır.
Burada DELETED olarak adlandırılan tablo, kayıt değiştirilmeden önce Satışlar tablosunda değiştirilmekte olan kayıttan oluşan tablonun tetikleyicide kullanılan mantıksal adıdır. INSERTED ise ayni satırın kayıt değiştirildikten sonra elde edilen satırdan oluşan tablonun tetikleyicide kullanılan mantıksal adıdır. Bunun nedeni aslında UPDATE bir DELETE ve INSERT işleminin ard arda uygulanması gibi düşünülmelidir.





Bir INSERT, UPDATE veya DELETE işlemi bir tabloya uygulandığında bu tablo üzerinde sırasıyla bir Instead Of INSERT, Instead Of UPDATE veya Instead Of DELETE Trigger’ı varsa bu işlem tablo üzerinde gerçekleşmez.
Onun yerine tetikleyici içinde yazılı kodlar yapılır. Bu işlemleri gösterebilmek için bir tablo oluşturalım. Bu tabloya ait nitelikler aşağıda verilmektedir.





Instead Of DELETE örneğine ait trigger aşağıda verilmektedir. Herhangi bir silme işlemi denendiğinde bu silme işleminin ne zaman denendiğini belirten bir trigger oluşturalım.





Bu denemeye ilişkin SQL ifadeleri ve sonuçları aşağıda verilmektedir.





Bütün INSTEAD OF trigger’ ları benzer şekilde;
Ekleme için Instead Of INSERT,
Güncelleme için Instead Of UPDATE,
Silme işlemi için ise Instead Of DELETE
    olarak oluşturulmaktadır.