30 Nisan 2012 Pazartesi

MS SQL 'de DML Triggers - Instead Of Triggers

Merhaba arkadaşlar.
"After trigger" nesneleri belirtilen işlemden sonra çalışırlardı. Yani belirtilen işlem gerçekleştikten sonra çalışırlardır. Fakat "Instead Of Trigger" nesneleri ise belirtilen işlem komutu gelince tetiklenirler ve o belirtilen işlemi yapmazlar. Onun yerine bizim belirttiğimiz işlemi yaparlar.

Hemen bir örnek ile kullanımını görelim.  Bu örnek için Northwind veri tabanında çalışıyorsanız eğer, "LogFile" adında bir tablo oluşturun. "Id", "SilenKisi" ve "Tarih" adında uc kolonu olması yeterlidir. Daha sonra "UrunKoruma" adında, "Products" tablosunun üzerinde bir "trigger" oluşturalım. Örneğin bir şirkette çalışıyorsunuz ve bir tablodan bir veri silinmeye çalışıldığında; sizden verinin silinmemesi, veriyi silmeye çalışan kişinin "Computer Name" 'i istendi. Tek yapmanız gereken aşağıdaki "trigger" nesnesini oluşturmak.

CREATE TRIGGER UrunKoruma
ON dbo.Products
INSTEAD OF DELETE
AS
      INSERT INTO dbo.LogFile (SilenKisi,Tarih)
      VALUES (SUSER_SNAME() , -- SilenKisi - nvarchar(50)
      GETDATE()               -- Tarih - datetime
      )
      PRINT 'Kac oglum Patron gelio'

"LogFile" tablomuza daha hiç veri girişi yapılmamış. Şimdi oluşturduğumuz "trigger" nesnesini tetiklemeye çalışalım.
DELETE FROM dbo.Products WHERE ProductID=65

Silmeye çalıştım arkadaşlar, bakalım silmiş mi?
SELECT ProductID,ProductName FROM dbo.Products WHERE ProductID=65

Hayır arkadaşlar görüldüğü üzere silmemiş. Birinci beklentimiz de buydu zaten. İkinci beklentimiz de "LogFile" tablosuna kaydetmesiydi, bakalım bir kayıt eklenmiş mi?

SELECT * FROM dbo.LogFile

"Trigger" nesnemiz on numara çalışıyor arkadaşlar."LogFile" tabloma da beklediğim kayıt başarılı bir şekilde gelmiş.

Bir örnek daha yapalım arkadaşlar. "Hesap" adında bir tablo oluşturalım. "Id", "Ad", "Bakiye"(money) ve "SilindiMi"(bit) kolonları olsun. Tablomuza iki kayıt girelim.

Bu tablomdan bir kaydın silinmesi istenirse, silinmesinde "SilindiMi" kolonu "true" yapılsın. Zaten arkadaşlar hiçbir şirkette kolay kolay hiçbir veri silinmez. Ya başka tabloya taşınır, yada bizim yaptığımız gibi bir işlemle silindi olarak işaretlenir. Şimdi gelelim "SilindiIsaretle" adında bir "trigger" yazmaya:

CREATE TRIGGER SilindiIsaretle
ON dbo.Hesap
INSTEAD OF DELETE 
AS
      DECLARE @Id INT
      SELECT @Id= Id FROM DELETED
      UPDATE dbo.Hesap SET SilindiMi=WHERE Id=@Id
      PRINT 'Silmeye kiayamadim :D'

"Trigger" nesnemi tetiklemek için tablodan bir kayıt silmeye çalışalım.
DELETE FROM dbo.Hesap WHERE Id=1

Tablomuza bakalım silinmiş mi yada ne gibi bir değişiklik olmuş?
SELECT * FROM dbo.Hesap  

Amacımıza ulaştık arkadaşlar.

Başka bir yazıda görüşmek dileğiyle, hoşçakalın...

Hiç yorum yok:

Yorum Gönder