Ana içeriğe atla

SQL Server Tetikleyicileri Üzerine (Triggerlar)

SQL Server’da tablo veya görünümlerde(view) herhangi bir işlem çalıştırıldığında (DELETE, INSERT, UPDATE) başka işlemlerin de yapılması isteniyor ise tetikleyiciler kullanılır. Her ne kadar Univera bünyesinde geliştirilen yazılımlarda DML mantığında çalışan tetikleyicileri kullanmasak da (Entity Framework doğasına aykırdır, tartışma konusudur); loglama, veri tutarsızlığı vb. işler için yararlı olduklarını söylemek mümkündür. Tetikleyiciler SQL cümleleri ile oluşturulur. Tetikleyici oluşturmak için aşağıdaki sözdizimi kullanılır.
CREATE TRIGGER [şema adı.] triggerAdı On tablo_adı | görünüm_ adı
[WITH dml_tetikleyici_seçeneği]
{
For | AFTER | INSTEAD OF } {[INSERT], [,],[UPDATE ],[,],[DELETE] }
[WITH APPEND]
}
AS sql ifadesi | EXTERNAL NAME method adı

SQL serverda 2 tür tetikleyici bulunmaktadır. Bunlar AFTER ve INSTEAD OF tetikleyicileridir.
  • AFTER (Ardı Sıra Tetikleyiciler): İşlem gerçekleştikten sonra tetiklenirler. Veritabanındaki INSERT, UPDATE, DELETE işlemlerinde kullanılır Tetikleyici sql cümlesinde FOR kelimesinin yanında AFTER yada INSTEAD OF kelimesi yoksa SQL Server’da bu tetikleyicinin AFTER tetikleyicisi olduğunu anlarız. AFTER tetikleyicileri görünümlerde (view) kullanılmaz.
  • INSTEAD OF(Yerine Tetikleyiciler) : INSTEAD OF tetikleyicileri belirtilen işlem yapılırken araya girerek (önce veya sonra) içerisindeki komutları yerine getirir. INSTEAD OF tetikleyicileri işlemlerin arasına girebildiğinden kontrol amaçlı kullanılabilirler. Temel veritabanı işlemlerinde INSTEAD OF tetikleyiciler de kullanılır. AFTER tetikleyiciler tablolarda tanımlanırken INSTEAD OF tetikleyiciler hem tablolarda hem de görünümlerde(viewlerde) tanımlanır. İşlemlerin arasında girerek işlem yaptıklarından kontrol amaçlı kullanılabilirler. WITH CHECK OPTION komutu ile yaratılan görünümlerde (view) INSTEAD OF tetikleyicisi kullanılmaz, sql server hata verir. Bu görünümlerde INSTEAD OF tetikleyicisi tanımlamadan önce WITH CHECK OPTION ifadesinin kaldırılması gerekmektedir.
After Tetikleyici Örnekleri:
Insert: Bir tabloya kayıt eklendiğinde başka bir tabloda işlem yapmak için insert tetikleyicisi kullanılır. Tabloya eklenen kayıt bilgilerine ulaşabilmek için inserted deyimi kullanılır. Aşağıdaki örneği verilen tetikleyici müşteri ödeme yaptığında müşterinin bakiyesinden ödeme tutarının çıkarılıp TBLCARIBAKIYE tablosunun güncellemesi için kullanılmaktadır.
CREATE TRIGGER TRG_CARIGUNCELLE ON TBLTAHSILAT
FOR INSERT
AS
BEGIN
  DECLARE @TAHSILATTOPLAMI DECIMAL(28,8)
  DECLARE @MUSTERIKOD INTEGER
  SELECT @MUSTERIKOD = MUSTERIKOD, @TAHSILATTOPLAMI = TAHSILATTOPLAMI   FROM INSERTED

  UPDATE TBLCARIBAKIYE SET BAKIYE = BAKIYE - @TAHSILATTOPLAMI
  WHERE MUSTERIKOD = @MUSTERIKOD
END
Delete: Bir tablodan kayıt silindiğinde başka bir tabloda işlem yapmak için delete tetikleyicisi kullanılır. Tablodan silinen kayıt bilgilerine ulaşabilmek için deleted deyimi kullanılır. Aşağıdaki örneği verilen tetikleyici müşteri ödeme yaptığında müşterinin ödemesi TBLTAHSILAT tablosundan silindiğinde TBLCARIBAKIYE tablosunda tahsilat iptali yapılan tutarı müşteri bakiyesine eklemek gerekmektedir.
CREATE TRIGGER TRG_TAHSILATIPTAL ON TBLTAHSILAT DELETE
AS
BEGIN
  DECLARE @TAHSILATTOPLAMI DECIMAL(28,8)
  DECLARE @MUSTERIKOD INTEGER
  SELECT @MUSTERIKOD = MUSTERIKOD, @TAHSILATTOPLAMI = TAHSILATTOPLAMI 
  FROM DELETED
  UPDATE TBLCARIBAKIYE SET BAKIYE = BAKIYE + @TAHSILATTOPLAMI
  WHERE MUSTERIKOD = @MUSTERIKOD
END
Update: Bir tabloda güncelleme işlemi yapıldığında başka bir tabloda işlem yapmak gerekiyor ise update tetikleyicisi kullanmak gerekmektedir update kayıtlarına ulaşmak için updated gibi bir deyim bulunmaktadır. Update işlemi bilindiği gibi delete insert demektir. Eski kayıt bilgilerine ulaşmak için deleted, yeni kayıt bilgilerine ulaşmak için inserted deyimi kullanılmaktadır. Aşağıdaki örnekte tahsilat tablosunda müşterinin ödemesi değiştirildiğinde TBLCARIBAKIYE tablosundada bakiyenin güncellenmesi gerekmektedir.
CREATE TRIGGER TRG_BAKIYEGUNCELLE ON TBLTAHSILAT
FOR UPDATE
AS
  UPDATE TBLCARIBAKIYE
  SET BAKIYE = CB.BAKIYE + DTABLE.BAKIYE - ITABLE.BAKIYE
  FROM TBLCARIBAKIYE CB
  INNER JOIN  deleted DTABLE ON CB.BAKIYE = DTABLE.BAKIYE 
  INNER JOIN  inserted ITABLE ON CB.BAKIYE = ITABLE.BAKIYE
Instead of Tetikleyici Örnekleri:
Insert: Bir tabloda insert işlemi uygulandığında tablo üzerinde INSTEAD OF INSERT tetikleyicisi varsa bu işlem tabloda gerçekleşmez, tetikleyicide yazılı kodlar çalışır. Eğer bu trigger içinde herhangi bir kod yazılmaz ise bu durumda tabloya kayıt eklenmeyecektir.
CREATE TRIGGER TRG_CARIBAKIYEEKLE on VIEWCARIBAKIYE
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO TBLCARIBAKIYE SELECT MUSTERIKOD, BAKIYE FROM inserted
END
Delete: Bir tabloda delete işlemi uygulandığında tablo üzerinde INSTEAD OF DELETE tetikleyicisi varsa bu işlem tabloda gerçekleşmez, tetikleyicide yazılı kodlar çalışır.
CREATE TRIGGER TRG_TAHSILATSIL ON TBLTAHSILAT
INSTEAD
OF DELETE
AS
  UPDATE
TBLTAHSILAT SET SONISLEMTARIHI = GETDATE()
  WHERE TAHSILATID IN (SELECT TAHSILATID FROM DELETED)
Tetikleyicilerin Aktif ya da Pasif Edilmesi
Bazı durumlarda işlemlerde tetikleyicileri pasif duruma almak ya da pasif durumdaki tetikleyiciyi aktif duruma getirmek gerekebilir. Bu işlemler için aşağıdaki sözdizimleri kullanılır.
Tetikleyiciyi aktif duruma getirme
ALTER TABLE <TABLO_ADI> ENABLE TRIGGER ALL
Tetikleyiciyi pasif duruma getirme
ALTER TABLE <TABLO_ADI> DISABLE TRIGGER ALL
Neslihan ÇALIŞKANEL

Yorumlar

Bu blogdaki popüler yayınlar

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz. UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir. Şekil 1. Class Diyagram Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Ama

Yazılım Maliyet Tahmineleme Tecrübeleri

Yazılım mühendisliğinde maliyet hesabı her zaman problem olmuştur. "Bu iş kaç Adam/Gün tutar?" sorusuyla sıkça karşılaşıyoruz. Adam/gün veya Adam/ay ölçütleri bir kaynağın/kişinin belirtilen zaman dilimindeki iş gücü anlamına gelir. Tabi bu noktada yine kafa karışıklıkları başlar. 6 A/G'lik bir işi hızlandıralım diye 2 kişi ile yapmaya çalışsak ve kaynak/kod, modül, altyapı, insan vb. her bir şeyi bir kenara bıraksak, matematiksel basit formülle 6/2=3 A/G'de biter? Gerçek hayat böyle değil, öncelikle bunu anlamamız lazım. Hep şu örnek verilir; "Aynı bebeği 2 kadın birlikte daha kısa sürede doğurur mu?" Eğer bunun cevabı "Evet" ise (veya bir gün böyle bir durum ortaya çıkarsa), yazımı değiştirmem gerekecek:) Mevzu gerçekten derin...Maliyet hesabı; bulunduğunuz firmanın yazılım süreçlerini hangi methodlarla uyguladığına, ilgili işin o dönemdeki aciliyetine, (şirket yönetiminin baskısına:)) vb. bir çok duruma bağlı olabilir. Örneğin; bizim firmada e

UML ve Modelleme – Bölüm 3 (Use Case Diyagramlar)

Önceki iki makalemizde ( 1 , 2 ) UML’e genel olarak değinip ve modellemede kullanacağımız dokuz diyagram hakkında bilgiler vermiştik. Bu makalemizde Use Case diyagramından detaylı bahsedeceğiz. Öncelikle, genel Use case diyagramının tanımını hatırlayalım. “Bir kullanıcı ve bir sistem arasındaki etkileşimi anlatan senaryo topluluğudur.” Ivar Jacobson Senaryo tanımı için der ki: “Aktörle sistem arasında gerçekleştirilen, sonucunda aktöre farkedilir getirisi/ faydası oluşan etkileşimli diyalogdur. ” UML Use Case Diyagramları  sistemin işlevselliğini açıklamak amacıyla kullanılır. Sistemin birbirinden ayrı özelliklerinin detaylarını göstermekten ziyade, Use Case Diyagramlar, tüm mevcut işlevselliği göstermek için kullanılabilir. Buradaki en önemli noktalardan biri,   Use Case Diyagramlar temelde sequence diyagram ve akış diyagramlarından farklıdır. Use Case diyagramlar dört ana elemandan oluşmaktadır. Aktörler , Sistem (Proje kapsamını belirtir) , Use Caseler ve bunlar ara