Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Transact Sql-Triggers(Tetikleyiciler)

Bu yazımda sizlere trigger lardan bahsedeceğim.2 tür Trigger vardır.Biri DML trigger biride DDL triggerdır.
Her ikisinide ayrıntılı olarak görelim.
DML Triggerlar.Bir tabloda insert,delete ve update işlemleri gerçekleştiğinde devreye giren yapılardır.Bu işlemler sonucunda veya bu işlemler sürerken devreye girerler.
Eğer bir tabloda insert işlemi yapılıyorsa,arka planda işlemler ilk önce RAM de oluşturulan inserted isimli bir tablo üzerinde yapılır.Eğer işlemde bir problem yoksa inserted tablosundaki veriler fiziksel tabloya insert edilir.İşlem bittiğinde RAM de oluşturulan bu inserted tablosu silinir.
Eğer bir tabloda delete işlemi yapılıyorsa,arka planda işlemler ilk önce RAM de oluşturulan deleted isimli bir tablo üzerinde yapılır.Eğer işlemlerde bir problem yoksa deleted tablosundaki veriler fiziksel tablodan silinir.İşlem bittiğinde RAM den bu tabloda silinir.
Eğer bir tabloda update işlemi yapılıyorsa, RAM de updated isimli bir tablo OLUŞTURULMAZ!!!Çünkü update işleminde veriler önce delete yapılır sonra yeni veri insert yapılır.SQL serverdaki mantık budur.Yani update işlemi yapılıyorsa arka planda RAM de hem deleted hemde inserted tabloları oluşturulur ve işlemler bunlar üzerinden yapılır.
Bu deleted ve inserted tabloları , ilgili sorgu sonucu oluştukları için o sorgunun kullandığı kolonlara da sahip olur.Böylece deleted ve inserted tablolarında select işlemi yapmak mümkündür.
Yapısı aşağıdaki gibidir.


Create trigger –trigger isim-
on -İşlemYapılanTabloİsmi-
after ve ya for –delete,update,insert-
as
-Kodlar-

Yukardaki yapıda after yerine for tagınıda kullanabiliriz.Arada pek fark yoktur.
Soru’’
Tedarikçiler tablosunda bir veri silinir ise tüm ürünlerin fiyatı 10 artsın.(Otomatik olarak)


create trigger Arttır
on Tedarikciler
after delete
as
update Urunler set BirimFiyati=BirimFiyati+10

Yukarda triggerımızı oluşturmuş olduk.
on Tedarikciler = Tedarikçiler tablosunda
after delete = Delete işlemi gerçekleşirse as den sonraki kodları gerçekleştir.
Bundan sonra Tedarikçiler tablosundan herhangi bir veriyi silince tüm ürünlerin fiyatı 10 arttırılacak.(Update yapacak)


delete from Tedarikciler where TedarikciID=30

Yukardaki işlemden sonra bize verdiği mesaj şu olacaktır.
(77 row(s) affected)
(1 row(s) affected)
İstersek triggerın üzerine sağ tıklayıp disable diyerek trigger ı devre dışı bırakabiliriz. Veya T-SQL komutları ile devre dışı bırakabilirz.


disable trigger Arttır on Tedarikciler

Yukardaki yapıda Tedarikciler tablosundaki Arttır triggerı devre dısı bırakılır.
Eğer aktif yapmak istersek,


enable trigger Arttýr on Tedarikciler

Soru’’
Tedarikciler tablosunda bir veri güncellenirse Kategoriler tablosunda meyve kokteyli isminde bir kategori oluşsun.
Önce triggerı yazalım,


create trigger KategoriOlustur
on Tedarikciler
for update
as
insert Kategoriler(KategoriAdi) values('Meyve Kokteyli')

Triggerı yazdık şimdi çalışıyor mu deneyelim.


update Tedarikciler set SirketAdi='Deneme' where SirketAdi='Exotic Liquids'

Yukardaki kodu execute yaparsak eğer bize şu mesajı verecektir.
(1 row(s) affected)
(1 row(s) affected)
Kategoriler tablosunu da kontrol edersek eğer Meyve Kokteyli isminde bir kategori oluşturulduğunu görürüz.
Soru’’
Personeller tablosunda bir kayıt silindiğinde silinen kaydın Adı,Soyadı,kim tarafından ve hangi tarihte silindiği başka bir tabloya kayıt edilsin.(Bir nevi log tablosu)
Öncelikle kayıt edeceği tabloyu oluşturalım.


go
create table log_tablosu
(
Id int primary key identity(1,1),
Aciklama varchar(100)
)

Şimdide triggerı oluşturalım.


create trigger Log_Trigger
on Personeller
after delete
as
declare @adi varchar(100),@soyadi varchar(100)
select @adi=Adi,@soyadi=SoyAdi from deleted
insert log_tablosu(Aciklama) values('Adı :' + @adi + ',Soyadı :' + @soyadi + ' olan personel ' + SUSER_SNAME() + ' tarafından ' + CONVERT(nvarchar(MAX),GetDate()) + ' tarihinde silinmiştir.')

SUSER_SNAME() = O an SQL servarda oturum açmış kişiyi verir.
Yukarıdaki kodda declare ile tanımlanmış olan adi ve soyadi değişkenlerine deleted tablosundan gelen adı ve soyadı verilerini atıyoruz.log_tablosu na raporlama yapıyoruz.
Şimdide kullanalım.


delete from Personeller where PersonelID=38

Bu kodu execute ettikten sonra bize şu mesajı verecektir,
(1 row(s) affected)
(1 row(s) affected)
Log tablosunu kontrol edersek eğer veri kaydını göreceksiniz.
Soru’’
Personeller tablosunda update gerçekleştiği anda devreye giren ve bir log tablosuna “değeri şu olan kayıt şununla değiştirilerek şu kullanıcı tarafından şu tarihte güncellendi” bilgisini yazan triggerı yazınız.
Öncelikle update işlemi olduğu için deleted ve inserted tablolarıyla işlem yapacağımızı belirteyim.İlk değeri deleted tablosundan alacağız ve ikinci yeni olan değeride inserted tablosundan alacağız.
Öncelikle log tablosunu oluşturalım,


create table Log_Table
(
Id int primary key identity(1,1),
Aciklama varchar(max)
)

Triggerı yazalım


create trigger Log_TriggerUpdate
on Personeller
for update
as
declare @ilkdeger varchar(50),@yenideger varchar(50)
select @ilkdeger = Adi from deleted
select @yenideger = Adi from inserted
insert Log_Table values('Değeri ' + @ilkdeger + ' olan veri ' + @yenideger + ' ile ' + SUSER_SNAME() + ' kullanıcısı tarafından ' + Cast(GETDATE() as varchar(100)) + ' tarihinde değiştirildi.')

Kullanalım,


update Personeller set Adi='Fatih' where Adi='Gençay'

Yukarıdaki kodu execute yaptıktan sonra Log_Table tablosuna bakarsak eğer raporumuz kaydedilmiş olarak görürüz.
NOT:Update yaparken güncellenen kaydın orjinali deleted tablosunda,güncellendikten sonraki hali inserted tablosundan bulunmaktadır.Çünkü güncelleme demek kaydı önce silmek sonra eklemek demektir.
Trigger sadece insert,delete ya da update işlemi için gibi bir zorunluluğu yoktur.Bunların hepsi içinde tek bir trigger yazabiliriz.


create trigger tg_Deneme
on Personeller
for insert,delete
as
-- komutlar

INSTEAD OF TRIGGERLAR
Delete,update ve insert işlemleri yerine şu işlemleri yap, gibisinden bir amaca hizmet ederler.
Şimdi aşağıdaki örnek triggerı inceleyiniz.Delete işlemi yapıldığın da çalışacak olan trigger,aslında delete işlemi yapmayacaktır.Onun yerine as komutundan sonraki işlemi yapacaktır.


create trigger DeleteYerine
on prs
instead of delete
as
declare @adi varchar(50),@soyadi varchar(50)
select @adi=Adi,@soyadi=SoyAdi from deleted
insert prs(Notlar) values('Adı : ' + @adi + ' , Soyadı : ' + @soyadi + ' olan veriler ' + SUSER_SNAME() + ' kullanıcısı tarafından ' + CAST(GETDATE() as varchar(50)) + ' tarihinde silinmek istenmiştir.')

Yukardaki trigger prs tablosuna delete işlemi yapılmaya çalışıldığı an prs tablosuna bu olayı raporlıyor.Ve delete işlemi yapmıyor.
Örnek’’
prs tablosundan Adi Andrew olan kaydın silinmesini engelleyen,diğerlerine izin veren trigger.


create trigger Kontrol
on prs
for delete
as
declare @ad varchar(50)
select @ad=Adi from deleted
if @ad = 'Andrew'
begin
print 'Bu kayıt silemezsiniz.'
rollback
end

Triggerımız bu şekilde olacaktır.
Buradaki “rollback” kavramını açıklayalım.
Kısaca işlemi geri al demektir.Normalde trigger içine yazdığımız her komut default transaction içinde çalıştırılır(implicit transaction).Bundan dolayı her bir komut transaction içindeymiş gibi rollback ile geri alınabilir.
Peki adımız “Andrew” değilse.O halde else bölümü olmadığı halde kodlar nasıl işleyecektir.
Eğer işlem rollback olmazsa commit olur.Böylece yapılan işlem gerçekleştirilir.Commit default değerdir.Aksini belirtmediğimiz sürece her sorgu commit olur.
Şimdi bu yazdığımız triggerı çalıştıralım.


delete from prs where Adi='Fatih'

Bu komutu çalıştırırsak silme işlemi gerçekleşecektir.


delete from prs where Adi='Andrew'

Bu komutta ise silme işlemi gerçekleşmeyecektir.
DDL Triggerlar
Create,alter ve drop işlemleri sonucunda devreye girecek olan trigger dır.


create trigger DDL_Trigger
on database
for drop_table,alter_table,create_function,create_procedure,drop_procedure
as
print 'Bu işlem gerçekleþtirilemez.'
Rollback

on Database; Şu an aktif olarak çalıştığım databasede bu triggerı devreye al.

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 27 Eylül 2016

    […] ibaretti. Yapılan her işlemi ya log tablolarına sorgular eşliğinde kayıt eder yahut trigger‘lar aracılığıyla takip sürecini […]

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir