Yukon ile gelen T-SQL Yenilikleri
DDL Triggers (Data Definition Language Triggers)
MS SQL Server 2000'de trigger'lar bir tablo veya view üzerinde çalıştırılan
Insert, Update veya Delete komutlarına tepki olarak çalıştırılması
istenen kodlar bloğudur. Trigger'lar ilişkisel veritabanlarında veri bütünlüğünün
korunmasında önemli bir yere sahiptirler.
MS SQL Server 2005 'e dek trigger'lar DML (Data Manipulation Language)
komutları üzerinde tanımlanabiliyorlardı. SQL Server 2005 Beta 2 (Yukon) ile
DDL (Data Definition Language) komutları üzerinde de trigger'lar tanımlama
olanağına sahip olduk. DDL yani Data Definition Language komutlarını kısaca
hatırlarsak bu komutların sql veritabanındaki nesneleri tanımladığını ve
bu nesneleri yönetmekte kullanıldığını söyleyebiliriz.
DML Trigger'larının verinin bütünlüğünün sağlanmasında kullanıldığını
söylemiştik. Peki SQL Server 2005 ile gelen DDL Trigger'ları hangi amaçlarla
kullanabiliriz:
Birinci kullanım alanımız veritabanımızı oluşturan nesneler üzerinde
herhangi bir değişikliği önlemek için olabilir. Örneğin veritabanındaki
bir tablomuzum Drop edilmesi için çalıştırılacak "Drop Table
Tablom" komutu sonrasında çalışacak olan DDL trigger'ında çalıştıracağımız
bir Rollback komutu ile tablonun Drop edilmesini önlemiş oluruz. DDL
trigger'ları Drop komutlarına tepki verecek şekilde kullanmak hacker saldırılarına
ek bir önlem olarak da kullanılabilir.
DDL Trigger'ların ikinci bir kullanım alanı da veritabanı üzerinde yapılan
yapısal değişikliklerin kayıt altına alınması olabilir. Örneğin bir
tabloda üzerinde Alter Table komutu ile gerçekleştirilebilecek değişiklikleri
loglamak istiyorsanız DDL trigger'ları kullanabilirsiniz.
Örneğin aşağıdaki Create Table komutu ile bir tablo oluşturalım.
Create Table Bankalar (
BankaNo int,
BankaAdi nvarchar(100)
)
Şimdi eğer veritabanımızdaki hiçbir tablonun Drop edilememesini
istiyorsak aşağıdaki kod bloğunu kullanarak DROP_TABLE DDL trigger'ı oluşturabilir
ve tüm işlemleri RollBack edebiliriz.
Create Trigger RollBackDrop
On Database
For Drop_Table
As
RollBack
RollBackDrop ismini verdiğimiz trigger veritabanındaki tüm tablolar üzerinde
etkin olacak şekilde yani "On Database" kullanılarak oluşturulduktan
sonra aşağıdaki drop komutlarını çalıştırabiliriz.
Drop Table Bankalar
Bu komut satırının çalıştırılmasından sonra elde edeceğimiz sonuç
aşağıdaki gibidir.
Msg 3609, Level 16, State 2, Line 2
Transaction ended in trigger. Batch has been aborted.
Ve Bankalar ismindeki tablomuz halen veritabanımızda varlığını
korumaktadır. Drop_Table DDL Trigger'ı RollBack komutunu çalıştırarak
tablonun Drop edilmesini önlemiştir.
Aşağıdaki Drop Trigger cümlesi ile oluşturduğumuz RollbackDrop
ismindeki DDL Trigger'ı veritabanımızdan silelim.
Drop Trigger RollbackDrop On Database
Artık aşağıdaki komut satırı veritabanımızdaki Bankalar isimli
tabloyu başarı ile Drop edebilecektir.
Drop Table Bankalar
DDL Trigger'lar ile ilgili önemli bir nokta da bu trigger'ların scope yani
faal oldukları sahalarıdır. Yani bir veritabanı üzerinde gerçekleştirilecek
DDL komutları üzerinde trigger'lar oluşturabileceğiniz gibi server (sunucu)
üzerinde de gerçekleştirilecek DDL komutları üzerinde trigger'lar oluşturabilirsiniz.
Yukarıdaki örnek veritabanını aktif sahası (scope) olarak alan bir
trigger'dır. Tüm sunucuyu (server) aktif sahası olarak alabilecek bir trigger
da yeni bir login kullanıcısı oluşturulduğunda veya drop edildiğinde çalışacak
şekilde oluşturulabilir.
Veritabanı üzerinde geçerli olmak üzere aşağıdaki işlemler de dahil
olmak üzere pek çok işlem ile ilgili olarak DDL trigger'ları oluşturabilirsiniz.
CREATE_TABLE
ALTER_TABLE
DROP_TABLE
CREATE_VIEW
ALTER_VIEW
DROP_VIEW
CREATE_SYNONYM
DROP_SYNONYM
CREATE_FUNCTION
ALTER_FUNCTION
DROP_FUNCTION
CREATE_PROCEDURE
ALTER_PROCEDURE
DROP_PROCEDURE
CREATE_TRIGGER
ALTER_TRIGGER
DROP_TRIGGER
CREATE_INDEX
ALTER_INDEX
DROP_INDEX
CREATE_STATISTICS
UPDATE_STATISTICS
DROP_STATISTICS
CREATE_USER
ALTER_USER
DROP_USER
Sunucu üzerinde etkin olacak şekilde de aşağıdaki işlemler ile ilgili
olarak DDL trigger'ları oluşturulabilir.
CREATE_LOGIN
ALTER_LOGIN
DROP_LOGIN
CREATE_ENDPOINT
DROP_ENDPOINT
GRANT_SERVER
DENY_SERVER
REVOKE_SERVER
CREATE_CERTIFICATE
ALTER_CERTIFICATE
DROP_CERTIFICATE