|
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
|
|