SQL Server 2005 - Hızlı El Kitabı
Skip Navigation Links.

TRIGGER

Trigger’lar kullanıcı tarafından çalıştırılmayan,veri tabanında gerçekleşen bir olay(event) sonrasında tetiklenen birimlerdir.C# dilinde event ne demekse,SQL Server’da Trigger o demektir.2 çeşit trigger vardır;biri, bir tablo üzerinde INSERT,UPDATE,DELETE işlemleri sırasında(öncesinde ve sonrasında) tetiklenmek üzere hazırlanabilen trigger’lar(DML-Data Manipulation Language) diğeride  CREATE,ALTER,DROP gibi işlemler öncesinde ve sonrasında tetiklenmek üzere hazırlanabilen trigger’lardır(DDL-Data Definiton Language).

Trigger’ların iki modu vardır;

1.       AFTER : Sadece tablolar üzerinde tanımlanabilir.Örneğin bir tabloya kayıt eklemek istediğimiz zaman, kayıt eklendikten hemen sonra trigger tetiklenir.

2.       INSTEAD OF : Tablolar ve View’lar üzerinde tanımlanabilir.Eylem gerçekleşmeden önce tetiklenen triggerler için kullanılır.Eğer Bir tablo üzerinde INSTEAD OF trigger’ı tanımlandı ise,ve o tabloya bir kayıt eklenmek isteniyor ise,ekleme işlemi yapılmaz onun yerine trigger tetiklenir.Bu trigger içinde de istersek ekleme işlemini tekrardan yaparız.Eğer bu trigger içinde herhangi bir şey yapmaz isek bu durumda kayıt eklenmeyecektir.Velhasıl kelam ekleme işlemi Trigger’a havale edilmiş olur.

Trigger içinde yapılamıyacak işlemler vardır.Bunlar;

1.       Veri tabanı oluşturulamaz,değiştirilemez,silinemez.

2.       Her hangi bir table CREATE,ALTER,DROP edilemez.Index CREATE,ALTER,DROP edilemez.

Trigger’lar içinde kullanılmak üzere 2 adet tablo mevcuttur.Bunlar INSERTED ve DELETED tablolarıdır.Trigger hangi tablo için kullanılıyor ise bu tablolar,trigger’ın kullanıldığı tablonun yapısıyla aynıdır.

·         Eğer Trigger INSERT işlemi için tanımlandı ise INSERTED tablosunda 1 kayıt varken DELETED tablosunda herhangi bir kayıt yoktur.

·         Eğer Trigger DELETE işlemi için tanımlandı ise INSERTED tablosunda hiç kayıt yokken DELETED tablosunda 1 kayıt vardır.

·         Eğer Trigger UPDATE işlemi için tanımlandı ise INSERTED 1 kayıt DELETED tablosunda da 1 kayıt olacaktır.

 

ÖRNEK: Veri tabanımızda 2 adet tablo olsun.Takim ve Log. Log tablosu veri tabanında yapılan işlemleri tutan bir tablo olsun.Amacımız ise Takim tablosuna bir kayıt eklendiğinde Log tablosuna da anlamlı bir kayıt eklemek olsun.Bu durumda bir adet Trigger tanımlayacağız.Eğer takım adı belirtilmez ise ekleme işlemi yapılmayacak,eğer bilgiler doğru girildi ise ekleme işlemine devam edilecek.

 

CREATE TABLE Takim

(

      Id          INT IDENTITY(1,1) NOT NULL,

      TakimAd     NVARCHAR(50) NULL,

      KurulusYil  INT NULL,

      Stad        NVARCHAR(50) NULL,

      Baskan      NVARCHAR(50) NULL,

      CONSTRAINT PK_Takim PRIMARY KEY(Id)

)

 

CREATE TABLE Log

(

      Id          INT IDENTITY(1,1) NOT NULL,

      Aciklama    NVARCHAR(100) NULL,

      CONSTRAINT PK_Log PRIMARY KEY(Id)

)



CREATE TRIGGER TakimEkleniyor ON Takim

INSTEAD OF INSERT

AS

BEGIN

      DECLARE @takimAd NVARCHAR(30)

      SET @takimAd = (SELECT Ad From INSERTED)

 

      IF(@takimAd IS NOT NULL)

      BEGIN

            INSERT INTO Satis.Takim

            SELECT Ad,Stad,Baskan,KurulusYil FROM INSERTED

      END

      ELSE

      BEGIN

            INSERT INTO Log VALUES('Takim Eklenemedi:'+@takimAd)

      END

END

 

CREATE TRIGGER TakimEklendi ON Takim

AFTER INSERT

AS

BEGIN

      INSERT INTO Log

      SELECT 'Takım Eklendi->'+Ad+':'+Stad+':'+Baskan+':'+

             CAST(KurulusYil AS CHAR(4)) FROM INSERTED

END

 

 

ÖRNEK: Aşağıdaki veri tabanı yapısında,Satis tablosunda bir silme işlemi gerçekleştiğinde SatisUrun tablosunda,silinmek istenen satış için tanımlanmış ürünlerin sayısı 3’ten fazla ise silme işlemi hem Satis hemde SatisUrun tablolarında gerçekleşsin, diğer durumda silme işlemi gerçekleşmesi.

 

Bu durumda Satis tablosu için DELETED Trigger’ı tanımlanmalıdır.

CREATE TRIGGER SatisSiliniyor ON Satis

INSTEAD OF DELETE

AS

BEGIN

      DECLARE @satisId INT

      DECLARE @sayi INT

      DECLARE c1 CURSOR

      FOR

      SELECT Id FROM DELETED

 

      OPEN c1

      FETCH NEXT FROM c1 INTO @satisId

 

      WHILE (@@FETCH_STATUS = 0)

      BEGIN

           

            SELECT @sayi=COUNT(*) FROM SatisUrun

            WHERE SatisId = @satisId

 

            IF (@sayi > 1)

            BEGIN

                  DELETE FROM SatisUrun WHERE SatisId=@satisId

                  DELETE FROM Satis WHERE Id=@satisId

                  Print 'Satis bilgileri silindi'+CAST(@satisId AS VARCHAR)

            END  

            FETCH NEXT FROM c2 INTO @satisId

      END

      CLOSE c1

      DEALLOCATE c1

END