Makale Özeti

Daha önceden DML(INSERT, UPDATE, DELETE) komutlarına yönelik kullandığımız trigger'lar artık DDL(CREATE, ALTER, DROP) deyimlerine yönelik te kullanılabilecektir.

Makale

SQL Server, verinin kontrolünü genişletmek, kompleks veri bütünlüğünü sağlamak ve belli işlemleri otomatikleştirmek için kullanılabilecek Trigger(tetikleyici) yapısını bünyesinde barındırmaktadır. Trigger yapısı, SQL Server 2005 ile çok daha geniş kapsamda veri kontrolü ve bütünlüğünü sağlamak için tasarlanmıştır. Makale içerisinde bu yeniliklerden bahsedeceğim. Konu olarak trigger anlatacağım için öncelikle trigger'ın amaçlarını incelemeyi yerinde görüyorum

DML (Data Modification Language) trigger ların amacı adı üzerinde veri üzerinde yapılan modifikasyonlara(INSERT, UPDATE, DELETE) bağlı olarak çalışabilmesi için düşünülmüş ifadelerdir. Bu trigger'lar dışarıdan bir isteğe gerek kalmaksızın, otomatik olarak çalışması için tasarlanırlar. Öyleyse biz herhangi bir tabloya ekleme,  silme ya da güncellemearsak ve bu tablo için bir trigger tanımlanmış ise;

  • Yaptığımız işlem tamamen geriye alınabilir (İçsel transaction'ın ROLLBACK edilmesi ile)
  • Yaptığımız işlemin yanında başka işlemlerin de yapılması sağlanabilir (AFTER trigger'ı ile)
  • Yaptığımız işlemin yerine tamamen farklı bir işlem yaptırılabilir (INSTEAD OF trigger'ı ile)

Buraya kadar anlattığım kısım SQL Server 2000 ile kullandığımız trigger yapısına yönelikti. SQL Server 2005 ile birlikte, sadece tablo kapsamında değil veritabanı ya da server kapsamında da geçerli olacak trigger'lar tanımlayabileceğiz. Bu tanımlayacağımız trigger'lar DDL (Data Definition Language) yani veri tanımlama dili ifadelerinde geçerli olacağından DDL trigger tanımlaması kullanılmaktadır.Veri tanımlama ifadeleri  ise CREATE, ALTER, DROP ifadeleriyle başlayan tanımlama ifadeleridir. Yukarıdaki trigger tanımını buraya uyarlamak gerekirse artık insert, update, delete deyimleri için geçerli olan trigger'lar create table, alter database deyimleri için de kullanılabilecek. DDL Trigger'ların kullanım alanları;

  • Veritabanı yapısına yapılabilecek değişiklikleri önlemek
  • Veritabanına yapılacak değişikliklerle birlikte gerçekleştirmek istediğimiz bir görev
  • Yapılan değişikliklerin, olayların kaydını tutabilmek

olarak sıralayabiliriz. Burada DDL trigger'lar üzerinde bir kısıt söz konusudur. Daha önceden DML trigger'lar da kullanabildiğimiz INSTEAD OF yani kontrolü yapılan işlemin yerine trigger'ın içerisinde tanımladığımız işlemin gerçekleşmesi için tanımladığımız trigger DDL trigger'lar üzerinde tanımlanamamaktadır. DDL trigger'lar üzerinde INSTEAD OF deyimini kullanamayacağız.

DDL Trigger'larında kullanılabilecek olay türleri aşağıdaki gibidir

Veritabanı Seviyesinde;

CREATE_APPLICATION_ROLE ALTER_APPLICATION_ROLE DROP_APPLICATION_ROLE
CREATE_ASSEMBLY ALTER_ASSEMBLY DROP_ASSEMBLY
ALTER_AUTHORIZATION_DATABASE    
CREATE_CERTIFICATE ALTER_CERTIFICATE  DROP_CERTIFICATE
CREATE_CONTRACT ALTER_CONTRACT DROP_CONTRACT
CREATE_DATABASE DENY_DATABASE REVOKE_DATABASE
CREATE_EVENT_NOTIFICATION DROP_EVENT_NOTIFICATION  
CREATE_FUNCTION ALTER_FUNCTION DROP_FUNCTION
CREATE_INDEX ALTER_INDEX DROP_INDEX
CREATE_MESSAGE_TYPE ALTER_MESSAGE_TYPE DROP_MESSAGE_TYPE
CREATE_PARTITION_FUNCTION ALTER_PARTITION_FUNCTION DROP_PARTITION_FUNCTION
CREATE_PARTITION_SCHEME ALTER_PARTITION_SCHEME DROP_PARTITION_SCHEME
CREATE_PROCEDURE ALTER_PROCEDURE DROP_PROCEDURE
CREATE_QUEUE ALTER_QUEUE DROP_QUEUE
CREATE_REMOTE_SERVICE_BINDING ALTER_REMOTE_SERVICE_BINDING DROP_REMOTE_SERVICE_BINDING
CREATE_ROLE ALTER_ROLE DROP_ROLE
CREATE_ROUTE ALTER_ROUTE DROP_ROUTE
CREATE_SCHEMA ALTER_SCHEMA DROP_SCHEMA
CREATE_SERVICE ALTER_SERVICE DROP_SERVICE
CREATE_STATISTICS DROP_STATISTICS UPDATE_STATISTICS
CREATE_SYNONYM DROP_SYNONYM  
CREATE_TABLE ALTER_TABLE DROP_TABLE
CREATE_TRIGGER ALTER_TRIGGER DROP_TRIGGER
CREATE_TYPE DROP_TYPE  
CREATE_USER ALTER_USER DROP_USER
CREATE_VIEW ALTER_VIEW DROP_VIEW
CREATE_XML_SCHEMA_COLLECTION  ALTER_XML_SCHEMA_COLLECTION DROP_XML_SCHEMA_COLLECTION

Server Seviyesinde;

ALTER_AUTHORIZATION_SERVER    
CREATE_ENDPOINT DROP_ENDPOINT  
CREATE_LOGIN ALTER_LOGIN DROP_LOGIN
GRANT_SERVER DENY_SERVER REVOKE_SERVER

Kaynak: SQL Server Books Online

Bu girişten sonra bir örneği yerinde görüyorum. Örneğimizde database'de tanımlı tablonun silinmesini engelleyecek bir DDL Trigger yaratacağız.

CREATE TRIGGER trg_droptbl

ON DATABASE --[ON ALL SERVER / ON DATABASE] Veritabanı seviyesinde geçerli bir trigger

FOR DROP_TABLE --[Yukarıdaki olay türlerinden biri girilecek] DROP TABLE ifadesi çalıştırılırsa trigger işleyecek

AS

PRINT 'Silme işlemi iptal edildi'

ROLLBACK

Bu ifadeyi çalıştırdığımızda, bize komutun başarılı bir şekilde çalıştırıldığını belirten mesajı göstererek işlemi tamamlayacaktır. Bu işlem ile birlikte veritabanı içerisinde trigger'ımız tanımlandı. Object Explorer'dan şekildeki gibi trigger'ımızı görüntüleyebiliriz.

Şimdi bir drop table komutu ile bu yarattığımız trigger'ı çalıştıralım. Veritabanı içerisinde tanımlı herhangi bir tabloyu silmem, bu trigger'ın çalışması için yeterli olacaktır. Bu veritabanı içerisinde bulunan "isimler" adlı tabloyu silmeye çalışacağız.

DROP TABLE isimler

Sorgumun sonucunda bana verilen mesaj da aşağıdaki gibidir.

Drop table işlemi, trigger içeriğinde yaptığımız ROLLBACK ile geri alındı. Tablomuzun silme işlemi iptal edildi.

DDL trigger'ları server seviyesinde de uygulamak gerekirse;

CREATE TRIGGER trg_crtlogin

ON ALL SERVER --Server seviyesinde bir trigger

FOR create_login --Her create login deyimi için geçerli

AS

ROLLBACK

Bu trigger ile birlikte server üzerinde login tanımlaması yapılmasını engellemiş bulunmaktayız.

Şuana kadar trigger'lar oluşturduk. Ancak bunların geçersiz kılınması için herhangi bir ifade kullanmadık. Trigger'ı silmek yerine onu pasifleştirebiliriz. Böylelikle trigger daha sonra tek işlemle yeniden aktif duruma çevirilebilir. Kullanacağımız komut;

DISABLE TRIGGER trigger_adı ON trigger_kapsamı

Yukarıdaki örneğe uyarlarsak;

DISABLE TRIGGER trg_crtlogin ON ALL SERVER

şeklinde kullanılabilir. Pasif durumdaki bir trigger'ı da tekrar aktifleştirmek içinse;

ENABLE TRIGGER trg_crtlogin ON ALL SERVER

Makele içerisindeki örneği Downloads linkinden indirebilirsiniz.


Bir sonraki makalemde EVENTDATA() fonksiyonun kullanımına da değineceğim.

Umarım faydalı olmuştur. Her türlü görüş ve önerileriniz için bana ulaşabilirsiniz

Volkan UÇARKAYA

vucarkaya@hotmail.com