2011-10-24 20 views
6

データベース内のトリガーを有効または無効にしようとすると、監査する方法が必要です。 DDLトリガーの代替は偉大なだけユーザーがDISABLE/ENABLEトリガーの監査SQL

ALTER TABLE <tableName> ENABLE TRIGGER <triggerName> 

OR

ALTER TABLE <tableName> DISABLE TRIGGER <triggerName> 

ステートメントを使用する場合の条件の下で動作します。私が判断したものから、ユーザーは、ALTERコマンドをバイパスし、次のステートメントを実行した場合、DDLの方法は役に立たないレンダリング:

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

私はそれらのどれも動作しないこれらのイベントをキャプチャするにはいくつかの考えを持っていました。そのうちの1つは、sys.triggersビューの基礎となるテーブルにアクセスできる場合、そのテーブルに挿入/更新トリガを配置し、トリガ名をフィルタリングして監査を取得することでした。私の疑念は、それが可能であっても、無限の再帰につながる可能性が高いということです。

この問題の代替解決策については、ここにいる人はいませんか?私はなぜMSが監査の範囲を逃れるステートメントの拡張版を許可するのか理解していない。つまり、最も簡単な方法からの監査です。 SQLプロファイラを使用すると、このために不必要なオーバーヘッドになるようです。

+0

うわー - ENABLE TRIGGER ... ON ...構文がSQL 2008 DDL監査をバイパスしていると言っていますか? http://msdn.microsoft.com/en-us/library/dd392015(v=sql.100).aspx – StuartLC

+0

DDLトリガを無効にできるかのように、DMLトリガだけで、監査トリガも無効にすることができます。これは私が思うデフォルトトレースに記録されています。 –

+0

はい、誰かがDISABLE TRIGGER ON の構文を使用してDMLトリガーを無効にした場合、DDLトリガーでそのイベントをキャプチャする方法はありません。 – Mark

答えて

5

私は最初にこれをアクセス許可で解決します。少数のdbasを​​除く誰もprodに対してalter tableパーミッションを持たないので、トリガーを有効または無効にすることはできません。アプリケーションがそれを使用している場合は、それを停止する必要があります。どのユーザーも表を変更する必要はありません。あなたがそれをしたいならば、あなたはおそらくデザイン上の欠陥があります。トリガーを実際に無効にしている人がいる場合は、間違いなく設計上の欠陥があります。無効にするトリガーを持つコードは、コードレビュー中に大きな赤い旗になるはずです。アプリケーションコードでトリガーを無効にすることは容認できません。これは、いつ実行するのかを知っている経験を持つdbasだけが行うべきことです。アプリケーションコードを記述していて、コードを正しく動作させるためにトリガーを無効にする必要があると思われる場合は、コードが正しくないか、トリガーを書き直す必要があります。

+0

私は再びアップアップすることができたらいいと思う。人々がトリガーを無効にすることを監査できないため、SQLが壊れていないため、信頼されていない人があまりにも多くの電力を持っているため、ポリシーが壊れています。 –

+0

誰もが自分の意見を正当に受ける権利がありますが、私はシステムのガバナンスも同様に重要であることに同意します。私はこのタイプの出来事を欠陥ではないと監査できないことに強く反対しています。異なる構文であっても、同一のイベントを監査する機能は、セキュリティツールではなく、贅沢であることを意味すると言えます。それ以外の場合は、単にDDLモデルからトリガーの監査を削除しないでください。もう一つの側面は、ガバナンスポリシーに欠陥があるかどうかです。システム上で誰がイベントを実行しているかを知ることが不可欠です。 – Mark

+0

私はそれが欠陥であることに同意しますが、人々にそのようなことをする権利を与えることは大きな欠陥です。 – HLGEM

関連する問題