TRIGGER Bir çeşit prosedür. Ancak bu prosedür kendiliğinden çalışır. Çalışması için tabloya veri eklemek, veri silmek, veri değiştirmek yeterlidir. Herhangi bir tablo üzerinde yapılan, insert, update veya delete işlemi sonrasında otomatik olarak aynı tablo veya başka bir tabloda veri ekleme, veri silme veya veri değiştirme işlemi istendiğinde trigger kullanılır. Triggerlarla girilen veriler kontrol edilebilir. Uygun olmaya veri girildiğinde veri iptal edilebilir. Trigger çeşitleri after trigger : insert, update veya delete işleminden sonra çalışan triger dır. 1
İnstead of trigger : insert, update veya delete işleminden önce çalışır. Örnek: Satış tablosuna yeni veri girildiğinde çalışacak ve veri eklendi mesajı verecek bir trigger yazınız ve satış tablosuna veri girerek test ediniz. CREATE TRIGGER trg_satis_gir ON Satis -- satış tablosuna veri girildiğinde. AFTER insert -- veri girildiğinde çalışacak AS BEGIN PRINT Veri girildi END 2
SON EKLENEN, DEĞİŞEN veya SİLİNEN bilginin içeriğine erişmek. Trigger bu verilere erişmek için iki tane sanal tablo kullanır. inserted tablosu deleted tablosu bu tabloların içinde neler bulunur. inserted tablosunda: insert deyimi çalıştığında girilen değer update deyimi çalıştığında değiştikten sonraki veri bulunur. 3
deleted tablosu: delete deyimi çalıştığında silinen veri, update deyimi çalıştığında, değişmeden önceki veri bulunur. Bir başka şekilde daha izah edelim. bir tabloya insert deyimi ile veri girildiğinde, girilen veri inserted tablosunda bulunur. Bir tablodaki veri update deyimi ile değiştirildiğinde, verinin önceki hali deleted tablosunda, yeni hali inserted tablosunda bulunur. Bir tabloda delete deyimi ile veri silindiğinde silinen veri deleted tablosunda bulunur. İnserted ve deleted tabloların yapısı ile triggerın bağlı olduğu tablonun yapısı aynıdır. 4
CREATE TRIGGER trg_satis ON satis AFTER insert, update, delete AS BEGIN Select * from inserted Select * from deleted END Go 5
6
Örnek: Satis tablosuna veri girildiğinde çalışan bir trigger yazınız. Bu trigger girilen urun, ürün tablosunda yok ise bu kaydı iptal etsin. 7
CREATE TRIGGER trg_satis_gir ON Satis AFTER insert AS. Sql kodları. Go Trigger içindeki Sql kodlarını yazalım -- girilen ürün kodu değerinin -- atanacağı değişkeni tanımla DECLARE @urun_no varchar(10) -- bu değişkene girilen değeri atayalım SELECT @urun_no = UrunNo from inserted -- ürün tablosunda @urun_no varmı? IF NOT EXISTS (select * from urun where UrunNo=@urun_no) Rollback tran 8
Else Print Kayıt Yaptım Go 9
Yukarıdaki trigger, ürün yoksa ürün tablosuna bu ürün için kayıt açsın ALTER TRIGGER trg_satis_gir ON Satis AFTER insert AS -- girilen ürün kodu deðerinin -- atanacaðý deðiþkeni tanýmla DECLARE @urun_no varchar(10) -- bu deðiþkene girilen deðeri atayalým SELECT @urun_no = UrunNo from inserted -- ürün tablosunda @urun_no varmý? IF NOT EXISTS (select * from urun where UrunNo=@urun_no) 10
Else Go insert urun (UrunNo) values (@urun_no) Print 'Kayýt Yaptým' Satis tablosuna veri girildiğinde girilen ürün; ürün tablosunda varsa, girilen miktar kadar ürünü eksiltsin, yoksa yeni ürün kaydı açsın. 11
Örnekler: Örnek1: Satış tablosuna yeni veri girildiğinde çalışacak ve veri eklendi mesajı verecek bir trigger yazınız. CREATE TRIGGER trgsatisgir ON Satis AFTER INSERT AS BEGIN PRINT 'Bu Mesaj Trigger dan Gelmektedir. Satış Tablosuna Yeni Veri Eklendi' END Yukarıdaki trigger'ın çalışmasını sağlamak için Satis tablosuna veri giriniz. INSERT Satis (SipNo, UrunNo, Miktar,GirisCikis) values 12
(10,'E',1,0) Örnek 2: Örnek 1 deki triggerda, girilen verideki değeri bir değişkene aktarıp bu değişkenin değerini yazdırıcak şekilde yeniden düzenleyiniz. ALTER TRIGGER trgsatisgir ON Satis AFTER INSERT AS BEGIN -- Değişkenleri tanımlayalım DECLARE @SipNo int, @UrunNo char(4), @Miktar float, @GirisCikis tinyint -- Girilen kayıttaki bilgileri değişkene aktaralım 13
SELECT @SipNo=SipNo, @UrunNo=UrunNo, @Miktar =Miktar, @GirisCikis =GirisCikis FROM inserted -- Değişkenleri yazdıralım PRINT 'SipNo='+ltrim(str(@SipNo)) + ', UrunNo='+ @UrunNo + ', Miktar='+ltrim(str(@Miktar)) END -- str fonk, sayıyı metine dönüştürür -- ltrim : metinin solundaki boşlukları siler Yukarıdaki trigger'ın çalışmasını sağlamak için bir kaç tane farklı Satis tablosuna veri giriniz. 14
INSERT Satis (SipNo, UrunNo, Miktar,GirisCikis) values (270,'F',1,0) 15