Trigger Nedir?
Trigger yani tetikleyici, sunucu üzerinde herhangi bir işlem gerçekleştiğinde başka bir işlem in gerçekleşmesi istendiğinde kullanılır. Örneğin bir kayıt silmek istediğinizde trigger sayesinde kayıt silinemeyeceğini bildirebilirsiniz.
Trigger işlem gerçekleşmiş gibi çalışarakda çalışabilir böylece değişikliklerden etkilenme ortadan kalkabilir. Gerçekleşen işlemler transaction olarak ele alınır ve işlemlerin geri alınmasını ROLLBACK ifadesi ile sağlanabilir.
Trigger Türleri
DDL(Data Definition Language) Trigger
Create, Alter ve DROP ifadeleri kullanıldığında devreye giren trigger türüdür. SQL ifadesi gerçekleştikten sonra devreye girer. İşlemin geri alınması için ROLLBACK ile işlem geri alınabilir.
1 2 3 4 5 6 |
CREATE TRIGGER TETIKLEYICI_ADI ON {ALL SERVER | DATABASE} [WITH ENCRYPTION] {FOR | AFTER} {[CREATE][,][DROP][,][GRANT],[,][DENY][,][]REVOKE} AS {SQL_IFADESI} |
ALL SERVER: Tüm sunucu üzerinde gerçekleştirilen işlemlere karşı duyarlı
DATABASE: Sadece aktif veritabanında yapılan değişimlere karşı duyarlı.
1 2 3 4 5 6 7 8 9 |
CREATE TRIGGER SILME_DEGISTIRME_TRIGGER ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS BEGIN DECLARE @MESAJ VARCHAR(MAX) SET @MESAJ='VTYS2 adlı veritabanında bulunan tablolar üzerinde değişiklik yapılmıştır.' PRINT @MESAJ END |
Yukarıda TRIGGER oluşturduk. Oluşturduğumuz trigger drop ve alter işlemi veritabanı üzerinde çalıştığında BEGIN içersinde yazan mesajı ekrana yazdıracak.
1 |
DROP TABLE OGRENCI |
Yukarıda öğrenci tablosu silindiğinde oluşturduğumuz trigger devreye girerek bize mesaj veriyor.
Logon Trigger
SQL Server’a giriş başarılı olduktan sonra devreye giren tetikleyicidirler. Başarısız olduğunda devreye girmezler.
1 2 3 4 5 |
CREATE TRIGGER TETIKLEYICI_ADI ON ALL SERVER [WITH ENCRYPTION] {FOR | AFTER} LOGON AS {SQL_IFADESI} |
Yukarıda kullanım şekline baktığımızda sadece ALL SERVER yani sunucu üzerinde işlem yapıldığında devreye giren trigger olduğunu farkediyoruz.
1 2 3 4 5 6 7 8 |
CREATE TRIGGER SESSION_LIMIT ON ALL SERVER FOR LOGON AS BEGIN IF ORIGINAL_LOGIN()='admin' AND (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process=1 AND original_login_name='admin') >3 ROLLBACK END |
Yukarıda ki kodlarda ORIGINAL_LOGIN() fonksiyonu ile admin kullanıcısının giriş yapıp yapmadığını ve sys.dm_exec_sessions tablosundan admin kullanıcının oturum sayısının 3 den fazla olup olmadığını kontrol etmektedir. Eğer 3den fazlaysa ROLLBACK ile yapılan işlem geri alınacaktır.
DML (Data Manipulation Language) Trigger
INSERT, UPDATE ve DELETE işlemleri gerçekleştirildiğinde devreye giren triggerlardır. After ve Instead Of türünde DML tetikleyiciler vardır.
After Trigger: İşlem gerçekleştikten sonra devreye giren tetikleyicilerdir. Sadece tablolarda kullanılır.
Instead Of Trigger: İşlem gerçekleşeceği sırada kullanılır. Daha çok kontrol amaçlı kullanılırlar. Hem tablo hem view de kullanılırlar.
1 2 3 4 5 6 |
CREATE TRIGGER TETIKLEYICI_ADI ON {TABLO_ADI |VIEW_ADI} [WITH ENCRYPTION] {FOR |AFTER | INSTEAD OF} {[INSERT][,][UPDATE][,][DELETE]} AS {SQL_IFADESI} |
Yukarıda FOR ve AFTER ifadeleri aynı görevi yapmaktadır. FOR sadece INSERT işleminde devreye girer. AFTER ise INSERT ve DELETE işleminde devreye girer.
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TRIGGER OGRENCI_KONTROL ON OGRENCI FOR INSERT AS DECLARE @OGRENCI_ID INT SELECT @OGRENCI_ID=OGRENCI_ID FROM INSERTED IF EXISTS(SELECT * FROM OGRENCI WHERE OGRENCI_ID=@OGRENCI_ID) BEGIN PRINT 'Aynı numaraya sahip öğrenci zaten var.' ROLLBACK END |
Yukarıda ki örnekte OGRENCİ tablosunda INSERT işlemi için geçerli olan trigger örneğidir. OGRENCI_ID sütünuna eklenen kayıt @OGRENCI_ID değişkenine gönderilir. Daha sonra SELECT işlemi ile OGRENCI_ID değeri tabloda olup olmadığı kontrol edilir. Eğer tabloda varsa trigger devreye girecektir.
1 |
SELECT * FROM OGRENCI |
1 |
INSERT INTO OGRENCI VALUES(1,'MEHMET','TOPAL') |
Yukarıda ki örneklerde ilk olarak öğrenci tablosunda ki tüm kayıtları ekrana getirdik. OGRENCI_ID değeri 1 varken yeniden OGRENCI_ID değeri 1 olan MEHMET TOPAL değerlerine sahip kayıt ekleme işlemi gerçekleştirmesi sırasında ‘Aynı numaraya sahip öğrenci zaten var.’ uyarısını alarak işlem gerçekleşmeyerek ROLLBACK oldu.