MSSQL Trigger Kullanımı

Aralık 30, 2011

 

Merhaba, arkadaşlar bugün mssql üzerinde trigger’ları nasıl kullanacağımızı inceliyor olacağız.Trigger’lar veri tabanımızdaki tablolarımız veya view’larımız üzerlerinde tanımlanabilirler.Tanımlanabilirler kelimesini biraz genişletelim isterseniz.Herhangi bir tablomuza tanımladığımız trigger o tablo üzerinde yapılan işlemlerden önce veya sonra çalışıp yapılması istenen işi yapmak üzere planlanır.Burada tablo üzerindeki işlemlerden kastımız Insert , Update, Delete işlemleridir.Trigger’lar bu 3 işlem dışında tanımlanamazlar ama tek trigger bir tabloya 3 işlem için birden tanımlanabilir.Yani bir trigger hem Insert  hem Update hemde Delete işlemleri için tanımlanabilmektedir.Insert işlemi için tanımlanan bir trigger o tabloya kayıt eklemeye çalıştığımız an kayıt daha gerçek tabloya eklenmeden devreye girer ve yapılması istediğiniz işi yapar burada önemli noktalardan bir taneside triggerlar ne kadar stored procedurelere benzeselerde işlevsellik olarak stored procedure’ler gibi parametre alamazlar ve geriye bir sorgu sonucu döndüremezler bu açıdan trigger’lar içerisinde return ifadesini kullanırken dikkatli olmalıyız.Trigger’lar geçici olarak hafızada oluşan Inserted ve Deleted tablolarını kullanırlar o an hafızada oluşan Inserted ve Deleted tabloları trigger ‘ın işlem yapmak istediği tablo yapısı ile aynıdır.Bu tablolarda o an işlemlerden etkilenen kayıtlar tutulmaktadır bu sebepten dolayı Trigger içerisinde o an hafızada oluşan Inserted ve Deleted geçici tablolarının içlerine yani işlem görmüş verilere ulaşabiliriz.Bir tablodan bir seferde 10 tane kayıt siliyorsanız ve bu tablo üzerinde Delete trigger’ı tanımlı ise bu trigger sadece bir kere çalışır her satır kayıt silinmesinde tetiklenmiyecektir.Aynı yapı Insert içinde geçerlidir.

 

Nerelerde Kullanılmalıdırlar

- Düzenli olarak yapılması gereken işlemler için. Örnegin : Herhangi bir alışveriş sitesinden bir ürün aldığımız zaman hemen bize siparişiniz alınmıştır bilgisi mail olarak gelmektedir bu işlem her ürün alan müşteri için sabit olarak yapılacağı için burada kullanmak mantıklı olacaktır.

- Çok önemli bilgilerinizi tutduğunuz tablonuzdan sizin dışınızda kimsenin veri silmesini istemediğiniz durumlarda trigger kullanmak mantıklı bir yoldur.

- Çok fazla ürün satışı olan bir web sitesinde ürünlerin stoklarının bilgilerini, o ürünün stoğu belirli bir seviyenin altına düştüğü zaman almak için trigger’ları kullanabilirsiniz.

- Bir tabloya veri kaydı olduğu zaman bu tablo ile başka bir tabloya daha ilişkilendirerek veri kaydetmek istediğimizde yine trigger’ları kullanmak akıllıca bir yol olacaktır

Not : İşlemlerimizi basit’leştirelim diye her işlemi trigger’ın veya stored procuder’elerin üzerine yıkmak uygulamamız için yavaşlatıcı bir unsur olacaktır.Gerekli yerlerde ise trigger kullanmak hayatımızı oldukça kolaylaştıracaktır.

 

 

2 çeşit trigger tanımlayabiliriz.Bunlar  AFTER ve INSTEAD OF trigger’larıdır.AFTER trigger’ı sadece tablolar üzerinde tanılanabilirken INSTEAD OF trigger’ı hem tablolar hemde view’lar üzerinde tanımlanabilir.AFTER trigger’ı işlem yapıldıktan sonra tetiklenir örneğin : Delete işlemi için bir after trigger’ı tanımlanırsa bu trigger silme işleminden sonra tetiklenecektir.INSTEAD OF trigger’ı ise işlem yapılmadan önce tetiklenir.

 

 

Veri tabanımızı oluşturalım

 

 

Musteriler tablomuzda bir tane yeni müşteri kaydında tetiklenecek olan trigger’ımızı yazalım.Bir üstteki resimde görülen kırmızı renk ile belirtilmiş Trigger tablosuna sağ tıklayalım ve new Trigger diyerek yeni bir trigger yaratalım.Bir trigger şu şekilde yaratılır

 

 

 

 

Trigger’ımızın adı MusteriKayit , ON Musteriler diyerek hangi tablo üzerinde işlem yapıldığında tetikleneceğini belirtiyoruz daha sonra ne zaman tetiklenecegini.Bu örnekte AFTER INSERT dediğimiz için kayıt veri tabanına girdiği zaman bu trigger tetiklenecektir.DECLARE ifadeleri ile @MusteriAd ve @MusteriSoyad diye 2 tane değişken tanımlıyoruz ve SELECT ile o an hafızada oluşacak INSERTED tablosunu sorgulayıp kayıt edilen bilgileri alıyoruz.Bu trigger çalıştıpı anda verş tabanına bir tane veri girişi olmuş olacağı için bu bilgiye INSERTED tablosundan ulaşıyoruz.

 

 

Veri silinmelerine karşın tablomuzu korumak için şu şekilde bir trigger yazmamız yeterli olacaktır

 

 

 

 

Bu trigger’dada rollback diyerek yapılan işlemin geri alınmasını sağlıyoruz.Musteriler tablomuzdan şu anda veri silmeye çalıştığımız zaman şu şekilde bir engel ile karşılaşırız

 

 

 

 

Musteriler tablomuzda silme işlemini bu şekilde trigger engelledi.Yeri gelmişken yazdığımız trigger’ları nasıl görebiliriz ve kaldırabiliriz ona bir bakalım

 

 

 

 

sp_helptrigger komutu ile istediğimiz tablo adını vererek hemen sağına o tablo üzerindeki trigger’ları ögrenebiliriz.İlk eklediğimiz MusteriKayit trigger’ı AFTER INSERT olduğu için buradada isinsert ve isafter kolonlarının içleri 1 ile gösteriliyor.

 

 

INSTEAD OF

Tanımı şu şekildedir

 

 

 

Kullanımı aynı AFTER trigger gibidir  ama giriş tanımlamalarındada belirtildiği gibi amaç burada biraz farklıdır.Bu trigger veri girişi olmadan tetiklenmektedir.Son olarak trigger’lar kullanımı oldukça basit ama sağladıkları fayda ise tartışılamayacak kadar fazladır.İyi çalışmalar

 

posted in SQL by gokhan

Follow comments via the RSS Feed | Yorum yapın | Trackback URL

1 Comment to "MSSQL Trigger Kullanımı"

  1. europelion wrote:

    Süper paylaşım ellerine sağlık :)

Leave Your Comment

*

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org