SQL Server Trigger

Trigger (Tetikleyici) veri tabanında işlem yaparken veya yapıldıktan sonra bazı işlemleri otomatikleştirmek veya kontrol altına almak için kullanılan özel saklı yordamlardır. Örnek olarak Stok ve Satış tablomuz olduğunu varsayalım. Ürünün satışı yapıldığı anda Satış tablosuna eklenirken, Stok tablosundan bir eksilmesini istiyoruz. 

Triggerlar tam bu noktada kullanabilecek olduğumuz yapılardır.  Triggerleri AFTER ve INSTEAD OF olarak 2 farklı şekilde tanımlayabiliriz. AFTER triggeri sadece tablolar üzerinde tanımlanabilir ve tablo üzerinde işlem yapıldıktan sonra tetiklenir. INSTEAD OF triggeri ise tablo ve view üzerinde tanımlanabilir ve işlem yapılmadan önce tetiklenir.

Triggerleri tanımladığımızda kullanabilecek olduğumuz inserted ve deleted tabloları vardır. Bu tablolar o anda işlem yapılan tablonun, işlem yapılan satır veya satırlardan oluşan triggerde kullanılan mantıksal adıdır.

Aşağıdaki komutları kullanarak Users diye bir tablo oluşturalım.

CREATE TABLE Users(
[Id] [varchar](50) NOT NULL,
[AdSoyad] [varchar](50) NULL,
CONSTRAINT [PK_Uye] PRIMARY KEY CLUSTERED
( [Id] ASC )

Oluşturduğumuz bu tablodan kayıt silmeyi engelleyecek trigger i yazalım. Öncelikle genel olarak trigger in yapısı öğrenelim.

Create Trigger “Trigger Adı”
on “Tablo Adı”
instead of veya after >> insert, update, delete “Tetikleneceği zaman ve işlem”
as
/*Yapma istediğimiz işlemler*/

Silmeyi engellemek için kullanacak olduğumuz trigger aşağıdaki gibidir.

Create Trigger trgNoDelete     /*Trigger Adı*/
on Users                                            /*Hangi tablo üzerinde çalışacak*/
after delete                                      /*Tetikleneceği zaman*/
as
rollback                                             /*Yapma istediğimiz işlemler*/
print ‘Bu tablodan kayıt silemezsiniz.’

Users tablosundan herhangi bir kayıt silinmek istediğinde rollback komutu ile işlem geri alınacak ve print ile mesajımızı yazdıracaktır.

Users tablosundan silinen bir kaydı xDeneme tablosundan da silmek istediğimizi varsayalım.

Create Trigger trgDelete
on Users
after delete
as
if exists (Select * from deleted)

begin  
Declare @id int
Select @id=ID from deleted
 if(@id>0)
Delete from xDeneme where ID=@id
end 

Users tablosuna bir kayıt eklemek istediğimizde kayıt sayısı 5000 geçmemiş ise xDeneme tablosuna eklemek istediğimizi varsayalım.

Create Trigger trgInsert
on Users
after insert
as
if exists (Select * from inserted)

begin  
Declare @id int, @sayac int
Declare @ad varchar(20)
Select @id=ID,@ad=AD from inserted
 if(@id>0)
Select @sayac=Count(ID) from Users
if(@sayac>5000)

insert into xDeneme values (@id,@ad)
else
rollback

end 

Users tablosuna kayıt ekleme işlemini iptal etmek istediğimizi varsayalım.

Create Trigger trgInsert
on Users
instead of insert
as 
rollback
print ‘Bu tabloya kayıt ekleyemezsiniz.’

Triggerleri enable/disable yapmak:

disable trigger “triggerAdi” On “tabloAdi”

enable trigger “triggerAdi” On “tabloAdi”

Trigger silmek:

drop trigger “triggerAdi”

Triggerları bir çok yerde kullanabiliriz fakat en çok aşağıdaki durumlarda kullanırız.

  • Değişiklikleri takip etmek,
  • Birincil anahtar üretmek,
  • Karmaşık iş kurallarını gerçekleştirmek,
  • E-posta atmak gibi olayları otomatik olarak yapmak,
  • Standart hata mesajlarının dışında bir hata mesajı elde etmek,
  • Veritabanı erişimlerini takip edebilmek,
  • Nesnede meydana gelebilecek değişiklikleri takip ve engellemektir.

Triggerların örnek kullanımlarını öğrenmiş bulunmaktayız. İyi çalışmalar 🙂