Dml Tetikleyiciler (TRIGGERS)

Dml Tetikleyicileri DELETE ve INSERT gibi komutları okuma ve işleme için kullanılan araçtır. Gelin daha detaylı bir şekilde öğrenelim.

Dml Tetikleyicileri DELETE ve INSERT gibi komutları okuma ve işleme için kullanılan araçtır. Gelin daha detaylı bir şekilde öğrenelim.

DML TETİKLEYİCİLER (DML TRIGGERS)

Tetikleyiciler bir tablo üzerinde ekleme, silme, güncelleme (insert, delete, update) komutları çalıştırıldığında devreye giren SQL kodlarıdır. Select cümleciği neticesinde herhangi bir satırda değişiklik olmayacağı için select cümleciği için tetikleyici yazılmaz.

Tetikleyiciler bir tabloya bağlanarak, bu tablo üzerinde kayıt ekleme,silme ve güncelleme işlemlerinden sonra  otomatik olarak çalışırlar.

Tetikleyiciler on ifadesinden sonra belirtilen tabloya bağlanırlar. Database kısmından tetikleyicinin bağlandığı tablo açılarak triggers bölümünde oluşturulan triggerlar görülebilir.

Tetikleyici Türleri

  • After Tetikleyiciler
  • İnstead of Tetikleyiciler

After Tetikleyiciler

For trigger olarakta bilinir. Update, Insert ve Delete sorgularından sonra gerçekleşmesini istediğimiz işlemleri yazmak için kullanılır.

Create trigger deneme on yazar
Bu satırda yazar tablosu üzerinde deneme isminde bir tetikleyici oluşturulacağı belirtiliyor.
after insert  (for insert te yazılabilir, after yerine for yazımı eskiye uyumluluk için vardır, daima after ifadesini kulllanınız, for u kullanmayınız)
Bu satırda ise tetikleyicinin yazar tablosuna kayıt ekleme işlemi sonrasında çalışacağı belirtiliyor. (insert yerine update yazılırsa kayıt güncelleme sonrasında çalışacak anlamına gelir, delete yazsa kayıt silme sonrasında çalışacak anlamına gelir.) Eğer bir tetikleyici hem ekleme sorgusunda hem de silme sorgusu sonrasında çalıştırılacaksa for, insert, update yazılır.
as

As kelimesinden sonra tetikleyicinin içereceği kodları yazmaya başlanır. Bu kısımda istenirse ve gerekirse exec komutu ile saklı yordam çalıştırılabilir.

Declare @isim ncvarchar(100)
nvarchar türünden olduğu için en fazla 50 karakter alabilen isim değişkeni tanımlanıyor.

insert komutu sonucunda oluşturulan Inserted isimli sanal tabloya eklenen yeni kayıt bilgileri kaydedilir.

Deleted Table

Deleted isimli tabloda, silme ya da güncelleme işlemlerinden etkilenecek kayıtlar saklanır.  Bu tablonun kayıt deseni, silme işlemi yapılan tablonun kayıt deseni ile aynıdır. Tetikleyicinin bağlı olduğu tabloda kayıt silme yapıldığında, silinen kayıtlar deleted tablosuna getirilir. Silme ya da güncelleme yapılmadığı durumlarda deleted tablosu boştur.

Inserted table

Bu tabloda ekleme ve güncelleme işlemlerinden etkilenecek kayıtlar saklanır. Ekleme ya da güncelleme işlemlerinde yeni kayıtlar bu tabloya kaydedilir. Bu tablonun kayıt deseni,  yeni kayıt eklenen tablonun kayıt deseni ile aynıdır.

Güncelleme işlemi  silme işleminden sonra yapılan ekleme işlemidir. Eski kayıtlar deleted tablosuna kaydedilir. Yeni kayıtlar ise inserted tablosuna kaydedilir.

Bu tablolar SQL Server tarafından otomatik olarak oluşturulur ve yönetilirler. Bu tablolara sadece trigger içerisinden erişilebilir. Çünkü bir tablodan silme, ekleme ya da güncelleme işlemine bağlı bir tetikleyici varsa bu tablolar oluşturulur. Bu tablolar Ram bellek üzerinde saklanır.

SELECT @isim = (SELECT adi + ' ' + soyadi FROM Inserted)

Bu satırla @isim değişkenine inserted tablosundaki adi ve soyadi alanları aralarına bir boşluk eklenerek atanıyor.

PRINT 'Yeni Yazar"' + @isim + '" eklendi.'

Bu satırla eklenen yazar ekrana yazılır.

Kodun Tam Hali

Create trigger deneme on yazar after insert

as

Declare @isim nvarchar(100)

SELECT @isim = (SELECT adi + ' ' + soyadi FROM Inserted)

PRINT 'Yeni Yazar"'+ @isim + '" eklendi.'

Tetikleyicinin çalışması için insert ile kayıt ekliyelim

insert into yazar values ('fatih','topcu','fatih.jpg','fatih@hotmail.com',2,5)

Bu komut sonucunda tetikleyici çalışır e ekrana şu çıktı yansır.

Yeni Yazar"fatih topcu" eklendi.

(1 row(s) affected)

Tablo veya view de herhangi bir alana ekleme/güncelleme işlemlerinin gerçekleşip gerçekleşmediği  update() ile sınanır. Insert/update tetikleyici içerisinde herhangi bir yerde kullanılabilir.

Update ile ilgili tetikleyici örneği

Create trigger tetikleyazar on yazar  after update

as

declare @eskiisim nvarchar(100)

declare @yeniisim nvarchar(100)

if not update(adi) and not update(soyadi)

begin

            return

end

select @eskiisim = (select adi+ ' ' + soyadi from deleted)

select @yeniisim= (select adi+ ' ' + soyadi from inserted)

print 'isim değiştirildi "' + @eskiisim+ '" to "' + @yeniisim + '"'


Bu tetikleyici yazar tablosunda bir ya da daha fazla kayıt güncellendiği zaman otomatik olarak çalışır. Daha öncede belirtildiği gibi güncelleme işleminde değiştirilecek kayda ait eski bilgiler deleted tablosuna, yeni bilgiler ise inserted tablosuna eklenir.

Tetikleyicinin çalışması için update ile kayıt güncelleyelim

update yazar set adi='fatih',soyadi='topcu' where id=14

Sonuç

isim değiştirildi "M. Tuncay TAŞÇI" to "fatih topcu"

(1 row(s) affected)

olur.

Delete ile ilgili tetikleyici örneği

create trigger tr_kayitsil on yazar after delete

as

declare @yayin bit

select @yayin = (select yayin from deleted)

if(@yayin= 1)

begin

            print 'yayınlanmasına izin verilen bir yazar silindi'

end

bu tetikleyicinin çalışması için herhangi bir kaydı silelim

delete from yazar where id=14

sonuç

yayınlanmasına izin verilen bir yazar silindi

(1 row(s) affected)

olur.

After tetikleyiciler, işlemler yapıldıktan sonra devreye girerler. İşlem sırası olarak sınamalar yapılır (check constraint), ekleme işlemi yapılır ardından after tetikleyiciler devreye girer.

Instead of tetikleyiciler ise SQL Server 2000 ile gelmiş yeni bir tetikletici türüdür. Örneğin Yazar tablosunda Update komutuyla güncelleme yapılacaksa, instead of update tetikleyicisi kullanıldığında update işlemi çalıştırılmaz, bunun yerine instead of tetikleyicisi çalışır.

update yazar set adi='fatih',soyadi='topcu' where id=14
komutu after update tetikleyicisi için çalıştırıldığında

  • Tüm sınamalar test edilir. (check, null,default)
  • FK sınaması yapılır.
  • Tetikleyici içerisinde kullanılacak inserted ve deleted taboları oluşturulur.
  • Tetiklemeye sebep olan komut çalıştırılır (Bu örnekte Update komutu)
  • Son olarak after update tetikleyicisi çalıştırılır.

Instead Of Tetikleyiciler

update yazar set adi='fatih',soyadi='topcu' where id=14
komutu instead of update tetikleyicisi için çalıştırıldığında

  • Tetikleyici içerisinde kullanılacak inserted ve deleted taboları oluşturulur.
  • Instead of tetikleyicisi çalıştırılır.

Bu tür tetikleyicilerde tetiklemeye sebep olan komut çalıştırılmaz.  O işlemin yerine instead of (Türkçe: in yerine) tetikleyicisi çalıştırılır. Dikkat edilirse Sınamalar ve FK sınamaları da yapılmaz.

İnstead of ve after tetikleyicilerinin farkını daha iyi anlamak için aşağıdaki örneği Sql Server’da deneyiniz.

create trigger silmetetikle on yazar after insert

as

print 'after tetikleyicisi insert komutu için çalıştı'

--aşağıdaki komutla kayıt ekleyelim

insert into yazar values ('Veli','Tokgöz','veli.jpg','veli@hotmail.com',2,5)

--yazar listesine bakalım kayıt eklenmiş mi?

select * from yazar

Sonuçta kaydın eklendiğini göreceksiniz.

sıra geldi aynı örneği instead of tetikleyici ile yapmaya:

--önce silmetetikle tetikleyicisini drop ile silelim

drop trigger silmetetikle

create trigger silmetetikle on yazar instead of insert

as

print 'instead of tetikleyicisi insert komutu için çalıştı '

--aşağıdaki komutla kayıt ekleyelim

insert into yazar values ('Tacettin','Durna','durna.jpg','tacettin@hotmail.com',2,5)

--yazar listesine bakalım kayıt eklenmiş mi?

select * from yazar

sonuçta Tacettin kaydının eklenmediğini göreceksiniz. Çünkü instead of ta sorgu cümleciği icra edilmez, onun yerine icra işlemi instead of tetikleyicisine bırakılır.

Tetikleyiciyi Pasif Yapmak

Bazı durumlrda tetikleyicisipasif yapmak gerekir. Bunun için table in altındaki triggers klasörü açılır. Pasif yapılacak triggers a sağ tıklanarak, disable seçilir. 2. yöntem ise aşağıdaki koddur.

alter table yazar

      disable trigger silmetetikle

tetikleyiciyi tekrar aktif yapmak için

alter table yazar

      enable trigger silmetetikle

komutu kullanılır.

Telefon +90 505 747 42 84
Email info@devedijital.com
Adres
Tacettin Veli Mahallesi Halit Narin Caddesi Bahadır Plaza Kat:11 Daire:41 38230 Deve Dijital Melikgazi/Kayseri/Türkiye