Published on

SQL Triggers(Tetikleyiciler) Nedir ? After-Instead of Triggers Nasıl Kullanılır ?

Authors
  • avatar
    Name
    Alperen Önal
    Twitter

Kelime anlamı tetikleyici olan Trigger , sql’de bir sorgu işlemi yapılınca başka bir sorgunun tetiklenmesi amacıyla kullanılmaktadır.

Örneğin bir tabloya insert işlemi veya delete işlemi yaptığımda hangi kayıdı sildiğimi veya eklediğimi başka bir tabloya ekleyerek log kaydı tutmak istiyorsam kullanabilirim.Veya bir banka veri tabanında müşteri parasını çekerken bakiyesinden otomatik olarak çektiği para kadar bakiye eksilmesini trigger ile gerçekleştirebiliriz.

Veri bütünlüğünü sağlamak veya ek bilgi türetmek için kullanılmaktadır.Mesela atm’den para çeken bir müşterinin olası elektrik kesintisi esnasında veya kısacacası arıza sonucunda işlem istenildiği gibi gerçekleşmediği esnada tüm işlemleri iptal ederek kartı geri vermesi örnek verilebilir.

Stored procedure’lere benzemesi doğaldır.Çünkü Triggers’ler otomatik çalışan bir stored procedure türüdür.

Triggers Çeşitleri :

Trigger’ler DML,DLL,Logon olmak üzere 3’e ayrılır biz bu yazımızda DML türünden bahsedeceğiz.

DML Tetikleyicileri After ve Instead Of olmak üzere 2 ye ayrılmaktadır.

After tetikleyicileri bir tabloda DML işlemleri gerçekleşince ilgili DML işlemi haricinde bizim istediğimiz kodları/sorguları da devreye sokar.

Instead Of tetikleyicileri bir tabloda DML işlemleri gerekleşince ilgili DML işlemi yerine bizim istediğimiz kodları/sorguları devreye sokar.

After Triggers

After Triggers Aşağıdaki gibi tanımlanır.

create trigger trigger_ismi on hangi_tablo
for hangi_islem_olunca
as
begin
--Devreye girecek olan kodlar
end

Tanımlamayı öğrendiğimize göre update işlemi gerçekleşince tetiklenen bir After Trigger yazalım.

create trigger ekleyince on musteriler
for insert
as
begin
declare @id int

select @id=smusId from inserted
insert into kayit values(@id)
end

Üstteki Trigger , musteriler tablosuna insert işlemi gerçekleşince inserted tablosundan eklenen kaydın id’ını bulur ve kayit isimli tabloya bu ‘id’i ekler.

Aşağıdaki kod çalışınca üste yazmış olduğumuz trigger doğrultusunda bazı işlemler devreye girecektir.

insert into musteriler values(22,'Alperen')

Sadece triggers’lerin içinde kullanılabilen 2 adet otomatik tanımlı tablo vardır.Insert ve Deleted bu tablolar ilgili işlemler(insert-delete) gerçekleşince geçici bir süreliğine eklenen-silinen kayıtları ilgili tablo içinde muhafaza ederler.

Aşağıdaki trigger bir delete işlemi yapılınca sadece 1 kaydın silinmesine izin verir.Eğer silinmeye çalışılan kayıt birden fazla ise rollback kullanılarak tüm bu delete işlemi iptal edilir.

create trigger silince on musteriler
for delete
as
begin
declare @satirSayisi int
select @satirSayisi = count(\*) from deleted
if(@satirsayisi>1)
begin
print 'Hata , sadece bir satır silebilirsiniz !'
print cast(@satirSayisi as nvarchar(10))+'adet silmeye çalıştınız'
rollback transaction
end
end

Aşağıdaki 1. ifade çalışmaz iken 2. ifade çalışacak ve 3 id’ye sahip olan müşteri silinecektir.

delete from musteriler
delete from musteriler where id=3

RollBack Transaction : Az önce de anlattığım gibi bir sorgunun istediğimiz gibi olmadığı durumda iptal edilerek en başa dönmesini sağlamaktadır.Yukarıda vermiş olduğum bankadan para çeken müşteri örneğindeki gibi istenilmeyen bir durumda , veri kaybını önlemek amaçlı sorguyu iptal ederek sorgudan önceki hale dönmeyi “RollBack Transaction” ile yapmaktayız.

Aşağıdaki trigger bir update işlemi olunca , update edilen ilgili kullanıcının id bilgisini print eder.

create trigger guncelleyince on musteriler
for update
as
begin
declare @id int
select @id = id from deleted
print cast(@id as nvarchar(10))+'idye sahip kullanıcı güncellendi.'
end

Id’yi neden updated tablosundan çekmedik ? Veya neden deleted tablosundan çektik ? Gibi sorular sorabilirsiniz.Bunun nedeni bir update işleminin hem silme hem ekleme işleminden oluşması gerçeğidir.Mesela id’si 7 olan bir kullanıcının ismini değiştirmek istediğimizde o kayıt tamamen silinir ve yerine id’si 7 olan ismi değiştirdiğimiz gibi olan kayıt eklenir.Bu nedenle sql’de updated diye bir tablo yoktur bunun yerine inserted veya deleted tabloları kullanılmaktadır.

Instead Of Triggers

Aşağıdaki şekilde tanımlanır.

create trigger trigger_ismi on ilgili_tablo
instead of hangi_islem_icin
as
begin
--calisacak_kodlar
end

Aşağıdaki trigger bir delete işlemi olunca o işlem yerine error vererek delete işlemini iptal etmektedir.

create trigger silmeyerine on musteriler
instead of delete
as
begin
raiserror('Silme Islemi Yasaklanmistir',16,1)
rollback transaction
end

Triggers konusu bu kadardı zaman ayırdığınız için teşekkürler.