T-SQL Triggerlar 

Trigger’lar (tetikleyiciler), veritabanında belirli olaylar meydana geldiğinde otomatik olarak çalışan özel saklı yordamlardır. T-SQL’de trigger’lar, veri bütünlüğünü sağlamak, karmaşık iş kurallarını uygulamak ve veri değişikliklerini izlemek için kullanılır.

Trigger Türleri

1. DML (Data Manipulation Language) Trigger’ları

  • INSERT Trigger: Tabloya yeni kayıt eklendiğinde çalışır
  • UPDATE Trigger: Tablodaki kayıt güncellendiğinde çalışır
  • DELETE Trigger: Tablodan kayıt silindiğinde çalışır

2. DDL (Data Definition Language) Trigger’ları

  • Veritabanı şemasında değişiklik olduğunda çalışır (CREATE, ALTER, DROP gibi komutlar)

3. LOGON Trigger’ları

  • Bir kullanıcı SQL Server’a bağlandığında çalışır

DML Trigger’larının Çalışma Zamanları:

  1. INSTEAD OF Trigger: Orijinal komut yerine çalışır
  2. AFTER Trigger (FOR Trigger): Orijinal komut çalıştıktan sonra çalışır

Trigger Oluşturma Komutu:

CREATE TRIGGER trigger_adi
ON tablo_adi
{FOR|AFTER|INSTEAD OF} {[INSERT],[UPDATE],[DELETE]}
AS
BEGIN
    -- Trigger mantığı buraya yazılır
END

Şimdi DML trigger yapılarını detaylı bir şekilde inceleyelim. Bir tabloda Insert, Update ve Delete işlemleri gerçekleştirildiğinde devreye giren yapılardır. Bu işlemler sonucunda veya sürecinde devreye girerler.

Inserted Table: Eğer bir tabloda Insert işlemi yapılıyorsa arka planda işlemler ilk önce RAM’de oluşturulan inserted isimli bir tablo üzerinde yapılır. Eğer işlemde bir problem yoksa inserted tablosundaki veriler fiziksel tabloya insert edilir. İşlem bittiğinde RAM’de oluşturulan bu inserted tablosu silinir.

Deleted Table: Eğer bir tabloda delete işlemi yapılıyorsa arka planda işlemler ilk önce RAM’de oluşturulan deleted isimli bir tablo üzerinde yapılır. Eğer işlemlerde bir problem yoksa deleted tablosundaki veriler fiziksel tablodan silinir. İşlem bittiğinde RAM’den bu deleted tablosu da silinecektir.

Eğer bir tabloda update işlemi yapılıyorsa RAM’de updated isimli bir tablo OLUŞTURULMAZ! ! !

  • SQL Server’da ki Update mantığı önce silme(delete), sonra eklemedir(insert).
  • Eğer bir tabloda update işlemi yapılıyorsa arka planda RAM’de hem deleted hem de inserted tabloları oluşturulur ve işlemler bunlar üzerinde yapılır.

Update yaparken güncellenen kaydın orjinali deleted tablosunda, güncellendikten sonraki hali ise inserted tablosunda bulunmaktadır. Çünkü güncelleme demek kaydı önce silmek sonra eklemek demektir.

Deleted ve inserted tablolarında bulunan kolonlar gerçek kolonlar ile aynı olmaktadır. Bu tablolar üzerinde sorgu çalıştırabiliriz.

Şimdi uygulamalı bir şekilde trigger örneklerimizi görelim. Aşağıdaki komutumuzla Personeller tablomuza bir insert işlemi gerçekleştikten sonra ilgili trigger yapımızı çalışmış olacak ve select sorgusu gelecektir.

CREATE TRIGGER INSERTTRIGGER
ON Personeller
AFTER INSERT
AS
select*from Personeller

Yukarıda oluşturduğumuz trigger ilgili tablo altında görülmektedir.

Şimdi tablomuza bir insert işlemi gerçekleştirelim.

Aşağıdaki komutla bir tablodan bir değer silindiğinde belirlenen bir kolonun sayı değeri yeni bir değerle set edilsin.

CREATE TRIGGER TRIGGERDELETE
ON Urunler
after delete
as
update Urunler set BirimFiyati=BirimFiyati+10
select*from Urunler

Bir ürün silmeden kolonlardaki değerlere bakalım.

Bir başka yapacağımız örnekte personeller tablosundan bir kayıt silindiğinde silinen kaydın adı soyadı ve kim tarafından silindiğini bulalım. Log tablosu oluşturmuş olacağız. Aşağıdaki komutta deleted olan tablomuz trigger çalıştırıldıktan sonra tablomuzun arka planda oluşan tablomuzdur.

  • inserted: INSERT veya UPDATE işlemlerinde eklenen/yeni değerleri içerir
  • deleted: DELETE veya UPDATE işlemlerinde silinen/eski değerleri içerir
CREATE TABLE RAPOR(
ID INT PRIMARY KEY IDENTITY(1,1),
AD VARCHAR(50) ,
SOYAD VARCHAR(50) ,
USERNAME VARCHAR(50)
)

CREATE TRIGGER LOGTRIGGER
ON PERSONELLER
AFTER DELETE
AS
DECLARE @ADI VARCHAR(50),@SOYAD VARCHAR(50),@USERNAME VARCHAR(50)

SELECT @ADI=Adi,@SOYAD=Soyadi from deleted
INSERT RAPOR(AD,SOYAD,USERNAME)VALUES(@ADI,@SOYAD,USER_NAME())
select*from RAPOR

delete  from Personeller where PersonelID=20

Trigger üzerinde bir başka yapacağımız örnek.

Create Trigger trgPersonellerRapor
 on Personeller
 after update
 as    
 Declare @EskiAdi nvarchar(MAX), @YeniAdi nvarchar(MAX)
 Select @EskiAdi = Adi from deleted
 Select @YeniAdi = Adi from inserted
 Insert LogTablosu Values('Adi ' + @EskiAdi + ' olan personel ' + @YeniAdi + ' yeni adıyla 
    değiştirilerek ' + SUSER_SNAME() + ' kullanıcısı tarafından ' + CAST(GETDATE() as nvarchar(MAX)) 
    + ' tarihinde güncellendi.')

 Update Personeller Set Adi = 'Yunus' Where PersonelID = 3

Multiple Action Trigger: Bir trigger üzerinde birden fazla işlem yapmamızı sağlar. Aşağıdaki komut birden fazla işlem yapılmaktadır.

CREATE TRIGGER INSERTTRIGGER
ON Personeller
AFTER INSERT,DELETE
AS
select*from Personeller


insert Personeller(Adi,SoyAdi)values('YUNUS','YUCELL')
DELETE FROM Personeller WHERE PersonelID=2010

Aşağıdaki komutla belirli addaki isme sahip kişinin isminin silinmesini engelleyen ama diğer isim silmelerine izin veren triger yapısı.

CREATE TRIGGER ENGEL
ON PERSONELLER
FOR DELETE
AS
DECLARE @ADI VARCHAR(20)
SELECT @ADI=adi from deleted
if(@ADI='YUNUS')
BEGIN
EXEC ('BU ISIM SILINEMEZ')
ROLLBACK
END
DELETE FROM Personeller WHERE PersonelID=1014
DELETE FROM Personeller WHERE PersonelID=2012

Yukarıda ismi YUNUS olmayan diğer kayıtların silindiğini görmekteyiz.

Instead Of Triggerlar: Belirli işlemleri engelleyip alternatif işlemler yapmak için kullanılır. Kullanıcı insert update delete işlemleri yerine başka işlem yapmamızı sağlayan bir yapı olarak karşımıza çıkmaktadır.

Temel komut:

CREATE TRIGGER TRIGGER_NAME
ON TABLE_OR_VIEW_NAME
INSTEAD OF INSERT-UPDATE-DELETE
AS

Yukarıdaki komut temel anlamda INSERT-UPDATE-DELETE işlemleri yerine aşağıdaki komutu yap anlamındadır. Herhangi bir update yapıldığı zaman update komutu işlemez. Instead of trıger yapısı bunu kendi içerisinde bulunan kod ne manada yapılmışsa o manada yapmaktadır.

INSTEAD OF trigger’lar orijinal işlemi tamamen geçersiz kılar, bu nedenle işlemi kendiniz gerçekleştirmelisiniz (INSERT, UPDATE veya DELETE komutlarını tetikleyici içinde çalıştırmalısınız).

DDL Trigger: Create, Alter ve Drop işlemleri sonucunda veya sürecinde devreye girecek olan yapılardır. Veritabanı bazlı yapılmaktadır. Veritabanı üzerinde yapılan triggerda belirtilen işlemler iptal edilmektedir.

CREATE TRIGGER DDL_Trigger
ON DATABASE
FOR CREATE_TABLE,DROP_TABLE, ALTER_TABLE,
CREATE_FUNCTION,ALTER_FUNCTION,DROP_FUNCTION,
CREATE_VIEW,ALTER_VIEW,DROP_VIEW,
CREATE_PROCEDURE,ALTER_PROCEDURE,DROP_PROCEDURE AS
AS
BEGIN
    PRINT 'Bu işlem gerçekleştirilemez.'
    ROLLBACK
END

DROP TABLE LogTablosu

Veritabanı altında aşağıdaki bölümde bulunmaktadır.

Aşağıdaki komutlarla veya ssms üzerinden kolaylıkla yapabiliriz.

Trigger Devre Dışı Bırakma
DISABLE TRIGGER TriggerName ON Table_name

Trigger Aktif Etme
ENABLE TRIGGER TriggerName ON Table_name

Ssms arayüzünden de yapılabilir.

Tablo seviyesinde Trigger’ları aşağıdaki gibi Triggers altında görebilirsiniz.

Veritabanı seviyesindeki Trigger’ları aşağıdaki gibi Programmability->Database Triggers altından görebilirsiniz.

Server Seviyesindeki Trigger’ları aşağıdaki gibi Server Objects’in altından görebilirsiniz.

Bu makalede trigger konusunu detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle..

“Şüphesiz peygamberlerimize ve iman edenlere, hem dünya hayatında, hem şahitlerin şahitlik edecekleri günde yardım ederiz.” Mü’min Suresi; 51. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir