MSSQL Trigger Kullanımı

Codx

Katılımcı Üye
30 Tem 2017
309
1



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
Şimdi bu YedekCustomers üzerinde bir trigger yazalım.


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.

Not:Delete 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.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.