Makale Özeti

Triggerlar aslında özelleştirilmiş Stored Procedurelerdir. , ve işlemleri için tablo bazında kullanılabilirler. Genel amacı veri bütünlüğünü korumaktır. Bunun için yapılacak herhangi bir değişiklikte izin verilmemiş işlemler veya gerçekleşmesi durumunda veri bütünlüğünde bozulmalara yol açacak işlemlerde veri bütünlüğünün korunmasına yardımcı olurlar.

Makale

Triggerlar aslında özelleştirilmiş Stored Procedurelerdir. INSERT, UPDATE ve DELETE işlemleri için tablo bazında kullanılabilirler. Genel amacı veri bütünlüğünü korumaktır. Bunun için yapılacak herhangi bir değişiklikte izin verilmemiş işlemler veya gerçekleşmesi durumunda veri bütünlüğünde bozulmalara yol açacak işlemlerde veri bütünlüğünün korunmasına yardımcı olurlar.

Sql Serverın eski sürümlerinde (6.5)den öncesi triggerlar farklı tablolar arasında birbirine referans gösterilen verilerin tutarlılığı için kullanılmaktaydı. Fakat daha sonra yapılan güncellemeler ile trigger ların kullanım alanı değişik tablolarda yer alan ve birbirleriyle mantıksal ilişkileri olan verilerin tutarlılığının sağlanması yönüne doğru kaydırıldı.

Syntaxı :

CREATE TRIGGER <trigger_adi>
ON t<tablo_adi>
FOR INSERT [, UPDATE, DELETE]
AS
<Sql Cümlesi>


şeklindedir.

Trigger larda TRANSACTON gibi update, insert ve delete metodlarına cevap verirler. Bu bağlamda transaction mantığı ile aynı mantığa sahiptir.

Çalışma mantığına bakacak olursak:

- Bir tablo için trigger tanımlıysa update, insert ve delete işlemleri başlamadan önce bir transaction başlatılır.
- Update, Insert ve Delete işlemleri gerçekleştirilir.
- Trigger çalıştırılır ve içersine yazdığımız sql ifadesi yerine getirilir.
- Trigger işlemi onaylar ise işlemi geçerli bulur ve transactionu COMMIT eder, geçerli bulmaz ise transaction ROLLBACK ile geri alınır. Tüm işlemler en baştaki hale geri getirilir.


DİKKAT EDİLMESİ GEREKENLER
- View yada temp_table üzerinde trigger oluşturulamaz. Lakin trigger view yada temp_table referansı barındırabilir.
- Bir tablonun herhangi bir satırında değişiklik yapılması durumunda çalışıp başka bir satırı update edecek bir trigger yapılan ikinci değişiklik için bir tetikleme barındırmaz.
- Bir tablo için Insert, Update ve Delete olmak üzere 3 trigger kullanılır.
- Çalıştırıldığında bir resultset döndürmez.
- İstenirse syscomments tablosundaki trigger bilgisi şifrelenebilir.
- Create, Alter, Drop gibi komutlar triggeriinde çalıştırılamaz.
- Trigger lara dışarıdan parametre yollanamaz.

Örnek :
TBL_ARACLAR isminde bir tablomuz olsun. Burada herhangi bir update, delete yada insert işlemi yapılınca çalışacak ve bize kaç kayıt üstünde değişiklik yapıldığını bildirecek bir trigger yazalım.

CREATE TRIGGER trg_KacKayitEtkilendi
ON TBL_ARACLAR

FOR INSERT,UPDATE,DELETE
AS
raiseerror(%d adet kayıt üzerinde değişiklik yapıldı, 0, 1, @@rowcount)
RETURN


DELETE FROM TBL_ARACLAR WHERE fld_arac_id = 126

Bu şekilde bir trigger bize ID nin Unique olduğudurum için

"(1) adet kayıt üzerinde değişiklik yapıldı" sonucunu döndürecektir.


Triggerlar çalıştığında "Inserted" ve "Deleted" tablolarında işlem yaparlar. Bu tablolar trigger ın bağlı olduğu tablo ile aynı yapıdadır. Ana tabloya bir kayıt eklendiğinde aynı anda "Inserted" tablosuna da kayıt eklenir. Ve tabiki kayıt silindiğinde "Deleted" tablosuna bir kayıt eklenir. Update işleminde ise Trigger ın çalışma mantığı sanki bir kaydın silinmesi ve yeni bir kaydın girilmesi durumu gibidir. Önce Deleted tablosuna bir kayıt girilir, ardından inserted tablosuna yeni kayıt girişi yapılır. Tabiki bu işlemler ana tabloda gerçekleşenler bir nevi logu şeklindedir.

Yine yukarıdaki tablomuz üzerinden gidelim ve bu tablonun bir araç kiralama servisinin veritabanında bulunduğunu varsayalım. Yeni örneğimiz bunun ile ilgili olacak.

Örnek:
Bu seferki örneğimizde bir aracı kiralamak istiyoruz lakin araç zaten şu anda bir müşteriye kiralanmış durumda. Yani zaten kiralanmış bir araca yeni müşteri girişi yapmamız gerekiyor. Trigger ımızın bu durumda veri bütünlüğünü korumak adına bize müdehale etmesi gerekiyor.

CREATE TRIGGER trg_AracKirala
ON TBL_ARACLAR

FOR INSERT,UPDATE
AS

IF(Select count(TBL_ARACLAR.fld_arac_id) From TBL_ARACLAR,inserted
where fld_arac_durum = kiralanmis and inserted.fld_arac_id = TBL_ARACLAR.fld_arac_id)>1

BEGIN

Print Bu araç zaten şu anda kiralanmış durumda

ROLLBACK TRANSACTION

END


Tabiki bu trigger ın çalışması ve örneğimizin sonuç vermesi için onu çalıştırmamız yani tetiklememiz gerekiyor.

Update TBL_ARACLAR Set TBL_ARACLAR.fld_arac_durum = kiralanmis where TBL_ARACLAR.fld_arac_id = 126

Bu Sql Commandı çalıştırmamız durumunda trigger ın veri bütünlüğünü korumak adına bize vereceği geri dönüş "Bu araç zaten şu anda kiralanmış durumda" olacaktır ve işlem rollback ile başa alınacaktır.

Bunu Otel rezervasyonlarında aynı odanın birden fazla müşteri için rezerve edilmemesine benzetebiliriz.

TRIGGER ve DİĞER SQL SERVER NESNELERİ KARŞILAŞTIRMASI
- Her ikisi de derlenmiş uygulamalar olduğunda stored procedure ler ile hemen hemen aynı performansta çalışırlar.
- Sql Server öncelikle View ve Stored Procedure leri daha sonra Trigger ları çalıştıracak bir hiyerarşik iş sırasına sahiptir.
- Stored Procedure ler i bizim çalıştırmamız gerekir Trigger lar ise Sql Server çalışmaya başladığı andan itibaren otomatik olarak çalışırlar.

Evren AYAN
www.evrenayan.net