Triggerları yazarken düzene dikkat etmek adına (okunabilirlik) isimlendirmeyi TR_<TableName>_<ActionName> şeklinde yapmanız doğru olur.
DDL: Create, Alter ve Drop işlemlerinde işlem gerçekleştikten hemen sonra devreye girerler. Kullanımı aşağıdaki gibidir. Süslü parantez (Curly Brackets) içindekiler kullanabileceğiniz seçenekler / düzenlemeniz gereken alanlardır.
CREATE TRIGGER trigger_name ON { DATABASE | ALL SERVER} [WITH ddl_trigger_option] FOR {event_type | event_group } AS {sql_statement}
Örnek:
CREATE TRIGGER TR_dbdummy_EraseBlock ON DATABASE FOR drop_table AS BEGIN PRINT 'Tablo silme işlemi trigger tarafından engellendi.' ROLLBACK END
Yukarıdaki kod bloğunu kaydettikten sonra aynı veritabanı/sunucu (seçiminize göre) içindeki herhangi bir tabloyu silmeye çalıştığınızda size hata verecektir. Kodlardan da görüldüğü gibi rollback ile sanaldaki işlemi gerçekleşmeden önce sonlandırıyor. Yapabileceklerinizin listesi:
- CREATE_TABLE
- CREATE_VIEW
- CREATE_INDEX
- CREATE_FUNCTION
- ALTER_TABLE
- ALTER_VIEW
- ALTER_INDEX
- ALTER_FUNCTION
- DROP_TABLE
- DROP_VIEW
- DROP_INDEX
- DROP_FUNCTION
DML: Tablo yada view üzerinde yapılan insert, update ve delete işlemlerinde devreye girer.
CREATE TRIGGER trigger_adi ON tablo_adi {FOR|AFTER|INSTEAD OF} {INSERT|UPDATE|DELETE} AS BEGIN --Sql ifadeler END
After: İşlem yapıldıktan sonra
Instead of: Yapmak istediğimiz işlemin yerine çalıştırılacağını belirtiyoruz
Insert, Update, Delete: Tabloda hangi sql işlemi sırasında çalıştırılacağını belirtiyoruz.
Begin…..End: Trigger çalıştırıldıktan sonra çalıştırılacak kodların yer alacağı kısımdır.
Aşağıdaki kod, alışveriş yapılınca kullanıcı adı, alışveriş tarihi, ve sipariş ID kaydeder.
CREATE TRIGGER TR_ShoppingLog_ShortLog ON ShoppingLog AFTER INSERT AS BEGIN INSERT Orders (CustomerID, OrderDate, OrderID) VALUES((SELECT Customer_Id FROM INSERTED), SYSDATETIME(), (SELECT ID FROM INSERTED)) END
kod içinde geçen
SELECT Customer_Id FROM INSERTED
satırında, sunucuya gönderilen veri kaydedilmeden önce “inserted” isminde sanal tablosu oluşturulur ardından varsa ilgili trigger(lar) tetiklenir. İlgili trigger da bu sanal tablodaki veriyi kullanarak BEGIN ‘den sonra bu verileri işlemek ve/ya belirtilen tabloya yazmak için kullanır. Veriler “ShoppingLog” tablosuna gönderildiği için “inserted” tablosu “ShoppingLog” tablosunun sütunlarıyla aynı sütunlara sahiptir.
Yine aynı satırda kullandığım SYSDATETIME() bir sistem metodudur ve sunucunun saatini DateTime biçiminde döndürür (sunucunun saatinin program saatinden farklı olabileceğini unutmayınız).