go
create trigger TriggerAdi
on TriggerinEtkilencegiDatabaseNesnesininAdi
after insert
as
--Trigger tetiklendiği zaman çalışacak sql sorguları
select * from shipers
2 farklı Trigger vardır.
1-) DML Trigger:Dml yani select, insert, update ve delete sorguları sonucunda tetiklenen trigger'lardır.
2-) DDL Trigger:Ddl yani drop,alter ve create sorguları sonucunda tetiklenen trigger'lardır.
A-)After : Dml veya ddl sorguları çalıştıktan sonra tetiklenir.Dml veya ddl sorguları işlenir ve daha sonrasında trigger içerisine yazılan sorgular işlenir.
B-)Instead of : Dml veya ddl sorguları çalıştıktan sonra tetiklenir.Dml veya ddl sorguları yerine trigger içerisine yazılan sorgular işlenir.
Basit örneklerden triggerlarımızı yazmaya başlayalım arkadaşlar.
create trigger tetikci
on shippers
after insert
as
select * from shipers
Yukarıdaki tetikçi ismindeki triggerımız shippers tablosu üzerinde insert işlemi gerçekleştikten hemen sonra kendi içerisinde yazılan sorguları çalıştırmaktadır.Yani kısaca shippers tablosuna veri her eklendiğinde o tabodaki tüm kayıtları gösterir.
create trigger guncellemeTetikcisi on
categories
after update
as
print 'Güncelleme tamamlandı.'
Yukarıdaki trigger da categories tablosu üzerinde update işlemi her olduğunda geriye mesaj döndürür.
Basit olarak iki tane trigger oluşturduktan sonra bilinmesi gereken önemli bir noktayı anlatmam gerekmektedir.T-Sql de insterted ve deleted isminde özel tablolar bulunmaktadır.Siz bir insert işlemi yaptığınızda öncelikle verileriniz inserted tablosuna eklenir.Eğer işleminiz başarılı bir şekilde gerçekleşirse verileriniz kaydetmek istediğiniz tabloya kaydolur.Aynı şekilde deleted tablosunda da delete sorgusu çekildikten sonra veriler önce buraya atılır daha sonra silinir.Fakat dikkat ederseniz updated gibi bir özel tablo bulunmamaktadır.Çünkü update işleminde önce veri silnir daha sonra ekleme işlemi yapılır.Yani update işleminde hem deleted hem de inserted tabloları kullanılır.
Bu bilgiden sonra basit olarak inserted tablosunu kullanarak bir örnek yapalım...
go
create trigger Haberci on
categories
after insert
as
select @sonId=CategoryId from
inserted
select * from categories where
categorId=@sonId
Yukarıdaki örnekte categories tablosuna eklenen son kaydın tüm bilgilerini gösteren bir trigger yazdık.
Bir örnekte de deleted tablosunu kullanarak bir trigger oluşturalım arkadaşlar...
create trigger yedekci on
shippers
after delete
as
declare @firmaAdi nvarchar(50)
declare @telefon nvarchar(24)
select @firmaAdi = CompanyName ,
@telefon=Phone from
deleted
insert YedekDataBase.dbo.SilinenShippers values (@firmaAdi,@telefon)
Yukarıdaki örneğimizde shippers tablosunda bir kayıt silindiğinde YedekDataBase isimli database in SilinenShippers isimli tablosuna silinen kaydı yedek olarak kaydeden bir trigger oluşturduk.Bu örneğimizde de görüldüğü gibi trigger ile silinen kayıtları otomatik olarak loglama yapabiliriz.
Şuana kadar tüm örneklerimizde bir işlem gerçekleştikten sonra Yani After ile kullanılan trigger lar oluşturduk.Fakat gerçekte bir veri tabanından veriler silinmez düşüncesinde olan yazılımcılardan olduğum için bir silme işlemi yapıldığında ne yapacağım ? Benim o silme işlemini engelleyip o kaydı pasif hale getirmem gerekmektedir(Pasif hale getirmek için önceden boolean tipinde bir kolon oluşturduğumu ve bu kolon uzerinden kontrol ettiğimi varsayalım) Şuana kadar trigger oluşturmak için kullandığımız yöntemlerle bu sorunu çözemem arkadaşlar.İşte burada devreye INSTEAD OF girmektedir.
İlk olarak senaryomuz diyelim ki istediğimiz bir tabloda istediğimiz bir kaydın silinmesini engellemek istiyoruz.Bu kayıt bizim için hayati önem arz ediyor diye düşünelim arkadaşlar.Bu işlemi aşağıdaki trigger ile kolaylıkla oluşturabiliriz.
create trigger silmeEngeli on
categories
instead of delete
as
declare @silinenId int
select @silinenId=categoryId from
deleted
if @silinenId=8
begin
print 'Kayýt silinemez'
rollback tran
end
else
begin
delete from Categories where
CategoryID=@silinenId
end
İkinci bir senaryoda silinmek istenen veriyi pasif hale getirmek istediğimizi düşünelim.Bu sorunu da aşağıdaki triggerla kolaylıkla çözebiliriz.
create trigger UrunSilmeEngelleyici
on Products
instead of delete
as
declare @silinenId int
select @silinenId=ProductId from
deleted
update Products set
Discontinued=0 where
ProductID=@silinenId
Peki oluşturduğumu tüm bu triggerlar nerede saklanıyor? Oluşturulan ddl trigger lar hangi tablo üzerinde oluşturulduysa yani hangi tabloda ddl işlemi yapıldığında tetikleniyorsa o tablonun altındaki trigger sekmesinde yer almaktadır.
Son olarak bir trigger ı istediğimiz anda enable edip istediğimiz anda disable etmek isteyebiliriz.Bunun için 2 yöntem vardır.İlk olarak ilgili trigger a sağ tıklayıp enable/disable seçeneğine tıklanarak yapılır.T-Sql ile de ,
disable trigger tetikci on
shippers --triggerı disable eder
go
enable trigger
tetikci on shippers --triggerı enable eder
Evet arkadaşlar bu makalemde triggerlara giriş yaptık.DML Triggerları anlattım.DDL Triggerları devamı olarak anlatacağım.Oldukça uzun oldu makale.Okurken sıkılıp yeter artık deme ihtimalinizi düşünerek diğer part ında anlatacağım.Görüşmek dileğiyle...
DDL ile DML karıştırmışsın
YanıtlaSilDML (insert,update,delete)
DDL ise (Create, alter, drop vb..)
tşkler.
:) ufak bir karışıklık olmuş . Düzelttim teşekkürler ... :)
Silörnekleriniz harika ellerinize sağlık
YanıtlaSil