DML TRIGGER'LARI ENABLE/DISABLE ETMEYİ BLOKLAMA
Bir ilişkisel veritabanı üzerinde çalışan uygulamaların çokluğu trigger'ların kullanımını zorunlu kılar. Merkeziyet, yönetimin başlıca esaslarından biridir. Veritabanı yöneticileri bazı trigger'ları hem kendi işini hem de developer'ın işini kolaylaştırmak için kullanır. Ancak yazılan trigger'ların yönetimi de başlı başına bir maliyet olarak görülür. Trigger'ların avantajlar ve dezavantajları analiz edilip karar verilmelidir. Trigger'lar bazen tehlikeli bazen de hayat kurtarıcıdır. Çoğu zaman, çok miktarda kullanılması best practice olmasa da uygulamacılar tarafından tercih edilen bir yöntemdir. Ancak bazı trigger'ları veritabanı yöneticileri sadece kendileri yönetmek isterler. İşte bu durumda o veritabanında ddladmin rolüne sahip uygulama geliştiricilerden tetikleyicilerin "disable/enable trigger" yetkileri alınması gerekir.
Trigger'lar tabloya bağlı çalışır. Herhangi bir trigger'ı disable/enable etme scripti aşağıdadır.
ALTER TABLE table_name DISABLE TRIGGER tr_name
ALTER TABLE table_name ENABLE TRIGGER tr_name
Veritabanı seviyesinde kullanılan "database trigger"lar mevcuttur. SQL Server'da bu nesneye Instance -> Database -> Programmability -> Database Trigger sekmesinden ulaşılabilir. Bu trigger'lar ile DDL(Data Definition Language) eventlerini(CREATE TABLE, DROP VIEW vb.) yakalamak mümkündür. Ancak bir tabloya ait trigger'ı disable/enable eden event'i direkt yakalamak mümkün değildir. Bu yüzden aşağıdaki script'i kullanarak bu event yakalanabilir.
CREATE TRIGGER [Block_Developer_Enable_Disable_Trigger] ON DATABASE
FOR ALTER_TABLE
AS
DECLARE @data XML;
SET @data = EVENTDATA();
IF (IS_SRVROLEMEMBER ('sysadmin') = 0 ) AND (CHARINDEX('TRIGGER',@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]',' NVARCHAR(MAX)')) <> 0)
BEGIN
PRINT 'To disable/enable a trigger, please ask your DBA!';
ROLLBACK TRANSACTION;
END
Örnek olarak; herhangi bir tabloya ait bir trigger'ı herhangi bir geliştirici disable etmek istediği zaman aşağıdaki hatayı alır.
To disable/enable a trigger, please ask your DBA!
Msg 3609, Level 16, State 2, Line 1
The transaction ended in the trigger. The batch has been aborted.
Sonuç olarak, ilişkisel veritabanı yönetim sistemlerinde trigger'lar vazgeçilmez nesnelerdir. Bu nesneler üzerindeki yetkilendirme ise her anlamda sınırlı tutulmalıdır. Veritabanı yönetim ekibi yaygın sorumluluk anlayışı ile veritabanları üzerinde her türlü yetkilendirmeyi/sınırlandırmayı yapmak zorundadır. Bu makalede, veritabanında bulunan tabloların trigger'larını enable/disable etmeyi engelleme script'i DBA'ler tarafından yetkilendirme kapsamında kullanılabilir.
Kaynak:[1]: http://tr.wikipedia.org/wiki/Trigger