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.
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
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 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.
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
update yazar set adi='fatih',soyadi='topcu' where id=14
komutu instead of update tetikleyicisi için çalıştırıldığında
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.
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.