Merhabalar, herkese iyi forumlar.
Başlıktan anlaşılacağı üzerine Trigger nedir? Neden ve Nasıl Kullanılır? konularından bahsediyor olacağız.
Trigger Nedir?
Trigger, adından anlaşılacağı üzere bir işlem yapılırken tetiklenen anlamına gelmektedir. Bu tetiklenme işlemi bir işlem yapılmadan önce veya sonrasında gerçekleştirilebilir.
- Bir tablodan bir veri silindiği zaman silinen verinin başka bir tabloya aktarılması.
- Sanal tablolarda işlemlerini gerçekleştirirler.
- Ekleme için Inserted tablosu
- Silme işlemi için Deleted tablosu devreye girmektedir.
- Güncelleme için bir update tablosu bulunmamaktadır. Her güncelleme işlemi temelde bir insert işlemi olduğu için Inserted veya Deleted tablosundan takip edilmektedir.
- Trigger bir işlem esnasında (ekleme silme işlemleri) yapılan işlemi geri sararak veri eklenmesine yada silinmesine engel olabilir.
Triggerlar Hangi Durumda Devreye Girer
After Trigger veya For Trigger belirtilen işlem sonrasında devreye giren triggerdır.
Kullanım Şekli
Not:After ve Instead Of aynı görevi görmektedir.
Örnekler Üzerinde Deneyelim
İşlemleri örnek database olarak Nortwind üzerinde deneyeceğim. Burada tablolar ilişkili olduğu için bulk insert ile herhangi birinin kopyasını alıyorum.
Kod:
SELECT * INTO YedekCustomers FROM dbo.Customers c
Kod:
CREATE TRIGGER DelCustomers
ON YedekCustomers
AFTER DELETE
AS
BEGIN
ROLLBACK
END
Delete işlemi yapılmak istendiği zaman buna engel olması işlemi rollback etmesi için bir trigger yazdık. Şimdi silmeyi deneyelim.
Görüldüğü üzere hata aldık. İşlemimiz trigger tarafından egellendi.
Notelete komutu trigger tarafından engellenir ama Truncate ile tüm tabloyu sıfırlamak istersek bu trigger işlemine takılmayacağı için buna engel olmayacaktır.
Delete yerine Update veya Insert yazarak aynı işlemi güncelleme silme ve ekleme durumlarını engellemek için de kullanabiliriz. Her bir işlem için sadece bir adet trigger yazılabilir. İki adet insert, update yada delete trigger'ı bulunamaz.
Disable Trigger
Otomasyonumuz üzerinde bir kullanıcının veri silmesin, eklemesini yada güncellemesini engelledik diyelim. Ben Backend tarafında veri tabanı programcısı olarak bu tabloda bir işlem yapma ihtiyacı duydum. Her seferinde trigger'ı silip yeniden mi oluşturmalıyım? Elbette hayır.
Bakın şu CustomerId'ye sahip kayıtı sil dedim ve çalıştı.
Disable ettiğimiz trigger'ı işlemimiz bitince Enable etmeyi unutmamalıyız. Bunun en iyi yolu Disable ve enable triggerlarını yazıp, bu iki satır arasında işlemlerimizi gerçekleştirmek olacaktır.
Eğer Trigger adını bilmiyorsak yada hızlıca işlemlerimizi yapmamız gerekiyorsa şu şekilde de kullanabiliriz.
Kod:
DISABLE TRIGGER ALL
DELETE FROM YedekCustomers WHERE dbo.YedekCustomers.CustomerID = 'ALFKI'
ENABLE TRIGGER ALL
Silinen Veriyi Yedekleyelim
Şimdi triggerımızı yazalım
Şimdi Test Edelim
Resimde görüldüğü üzere işlem başarı ile gerçekleşti.
Konum buraya kadardı okuduğunuz için teşekkür eder, iyi forumlar dilerim.