2011-10-24 17 views
6

Birisi veritabanımızda bir tetikleyici ENABLE ya da DEVRE DIŞI BIRAKMA girişiminde bulunduğunda denetleme yöntemine ihtiyacım var. DDL tetikleyicisi alternatif harika ama sadece kullanıcıDISABLE/ENABLE Tetikleyicileri Denetimi SQL

ALTER TABLE <tableName> ENABLE TRIGGER <triggerName> 

VEYA

ALTER TABLE <tableName> DISABLE TRIGGER <triggerName> 

deyimi kullandığında için koşul altında çalışır. Ben onlardan bu olaylar hiçbiri işe yakalayan çeşitli düşünceler vardı

DISABLE TRIGGER <triggerName> ON <tableName> 
ENABLE TRIGGER <triggerName> ON <tableName> 

: Kullanıcı ALTER komutu bypass şu ifadeleri yürütür eğer tespit ettik kadarıyla, DDL yöntemi işe yaramaz hale getirir. Bunlardan biri, sys.triggers görünümünün altında yatan tabloya erişebilseydim, o tabloya bir ekleme/güncelleme tetikleyicisi yerleştirebilir ve denetimi elde etmek için tetikleyici ismine filtre uygulayabilirdim; ama benim şüphem, yapılması mümkün olsa bile, sonsuz bir tekrarlamaya yol açacağıdır.

Bu soruna alternatif çözümler için herhangi birinin olası önerileri var mı? MS'nin neden daha iyi ifade sürümlerinin denetimlerin kapsamından kaçmasına izin vereceğini anlamıyorum. Yani, en basit yöntemlerden denetim; SQL profiler kullanarak bunun için gereksiz bir yük olarak görünüyor.

+0

Wow - ENABLE TRIGGER ... ON ... sözdizimi SQL 2008 DDL Denetimi'ni atlıyor mu? http://msdn.microsoft.com/en-us/library/dd392015(v=sql.100).aspx – StuartLC

+0

Sadece DML, birisinin DDL tetikleyicilerini devre dışı bırakabileceği gibi, tetiği de tetikleyebilirler mi? Bu, bence varsayılan izde kaydedilir. –

+0

Evet, birisi DML tetikleyiciyi DISABLE TRIGGER ON sözdizimini kullanarak devre dışı bırakacak olsaydı, bu olayı bir DDL tetikleyicisi aracılığıyla yakalamanın hiçbir yolu olmazdı. – Mark

cevap

5

İlk olarak bunu izinler aracılığıyla ele alırım. Birkaç dbas dışında hiç kimse prod üzerinde tablo izinlerini değiştirmemeli ve bu nedenle tetikleyiciyi etkinleştirip devre dışı bırakamaz. Bir uygulama kullanıyorsa, bunu durdurmalıdır. Herhangi bir kullanıcının tabloları değiştirmesi için bir mazeret yoktur. Bunu yapmak istiyorsan, probaly bir tasarım kusuruna sahipsin. Eğer gerçekten tetikleyicileri devre dışı bırakan insanlarınız varsa, kesinlikle bir tasarım kusurunuz var. Devre dışı bırakma tetiklemeli herhangi bir kod, bir kod incelemesi sırasında büyük bir kırmızı bayrak olmalıdır. Uygulama kodunda bir tetikleyiciyi devre dışı bırakmak kabul edilemez olmalıdır. Bu, yalnızca ne zaman yapacağımı bilme deneyimine sahip olan dbas tarafından yapılması gereken bir şeydir. Uygulama kodunu yazıyorsanız ve kodunuzun çalışması için bir tetikleyiciyi devre dışı bırakmanız gerekiyorsa, kodunuz yanlıştır veya tetikleyicinin yeniden yazılması gerekir, tetikleyicilerin devre dışı bırakılması yalnızca durumların en azında gerçekleşmelidir.

+0

Keşke tekrar yapabilirim. SQL, tetikleyicileri devre dışı bırakan kişileri denetleyemediğinizden, kırılmamış olduğundan, güvenilir olmayan kişilerin çok fazla güce sahip olduğu için politika kırılmaz. –

+0

Herkes kendi fikirlerine haklı olarak hak verirken, aynı zamanda sistemin yönetiminin eşit derecede önemli olduğunu kabul ediyorum; Bu tür olayları bir kusur olarak denetlemenin yetersiz olduğuna katılmıyorum. Bu, aynı olayı denetleme yeteneğinin farklı sözdizimiyle, bir güvenlik aracının aksine bir lüks olduğunu ima etmektir. Aksi halde, neden tetikleyicilerin denetimini DDL modelinden tamamen kaldırmıyorsunuz? Bunun bir başka yönü de, bu, yönetim politikalarına yönelik bir kusurun olması değil; Sisteminizde olayları kimin yürüttüğünü bilmek bir zorunluluktur. – Mark

+0

Bunun bir kusura katılıyorum, ancak insanlara böyle şeyler yapma haklarının tanınması daha büyük bir kusurdur. – HLGEM

İlgili konular