Instead Of Dml Trigger
İnstead of Dml trigger’ları tetiklendiğinde dml komutları yerine sadece trigger tetiklenir. Bir insert işlemi için instead of trigger’ı oluşturduğumuzda tablo üzerinde insert işlemi yapmak istediğimizde insert işlemi yapılmaz bunun yerine instead of dml trigger’ımız tetiklenir. Bu yöntem tablo üzerinde yapılacak olan dml işlemlerini kontrol etmek için kullanılır. After dml triggerlar ile instead of dml triggerlar arasındaki en büyük fark; after dml triggerlar sadece tablolar üzerinde tanımlanırken, instead of dml triggerlar hem tablo hem de view üzerinde tanımlanabilmektedir.
Şimdi bir tane instead of dml trigger yazalım. Yapılan insert işleminde girilen tarih eğer şimdik tarih değerinden küçükse verinin girilmesini engelleyip uyarı mesajı verelim.Bunun için Adventureworks veritabanında person.emailadress tablosunu kullanalım.
create trigger Person.Trg_AdressDateControl on Person.EmailAddress instead of insert as set nocount on declare @ModifiedDate Datetime select @ModifiedDate=ModifiedDate from inserted if(@ModifiedDate < GETDATE()) begin print 'Eski Tarihli Kayıt Eklenemez' rollback end else begin insert into Person.EmailAddress (BusinessEntityID,EmailAddressID,EmailAddress,rowguid,ModifiedDate) select BusinessEntityID,EmailAddressID,EmailAddress,rowguid,ModifiedDate from inserted end insert into person.EmailAddress (EmailAddress,rowguid,ModifiedDate) values ('hayric@gmail.com',NEWID(),DATEADD(day,-1,getdate()))
Dikkat edilecek olursa rollback ile işlemi geri alabildik bunun sebebi triggerın tetiklenmesiyle sql server otomatik olarak bir tane transaction başlatır. Bu transactionın rollback olması ise yapmak istediğimiz dml işlemini iptal eder.
Update Fonksiyonu
Şimdiye kadar insert ve delete dml işlemleri ile alakalı trigger hazırladık. Update işlemi için özel bir sanal tabloumuz yoktur, update işlemi önce verinin silinip (deleted) sonra eklenmesi (inserted) olarak tanımlandığı için özel bir tablosu yoktur. Biz deleted tablosu ve inserted tablosundaki verileri karşılaştırmak yerine sql serverin update() fonksiyonunu kullanacağız.
Update fonksiyonu parametrek olarak kolon adı alır ve eğer o kolon güncellenmiş ise geriye true değerini döndürür. Bir tane update triggerı yazalım. Bu sefer tablomuz Person.CountryRegion tablosudur.
create trigger Person.Trg_CountryRegionCodeControl on Person.CountryRegion after update as if update(CountryRegionCode) begin print 'Ülke Kodu Değiştirilemez' end update Person.CountryRegion set CountryRegionCode='BIX' where Name = 'Andorra'
İşlemimiz tiggerımıza takılıp rollback yapılmıştır. Böylece tablolarımızda update edilmesini istemediğimiz alanları kontrol edebiliriz.
İyi çalışmalar.