データベースに対するすべての実行アクションを監査するデータベース監査仕様を持つSQL Serverデータベースがあります。
CREATE DATABASE AUDIT SPECIFICATION [dbAudit]
FOR SERVER AUDIT [servAudit]
ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public])
一部のクエリは、結果セットのすべての行に対してスカラー関数の使用を監査ログに書き込むことがわかっています。これが発生すると、ログがETLで最終的な休憩場所に達する前にログがいっぱいになり、ログにギャップが生じます。
残念ながら、コンプライアンス上の理由により、すべてのEXECUTE
ステートメントの監査を停止することはできません。
この問題へのアプローチについて最初に考えたのはWHERE
、サーバー監査の句を使用してアクティビティを除外することです。コードは次のようになりました。
WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' )
残念ながら、SQL ServerはリレーショナルIN演算子を許可しません(おそらく、監査ログに書き込む必要があるたびにクエリを実行したくないためです)。
私たちは、どのハードコードストアドプロシージャ書き込みを避けたいobject_id
にWHERE
句が、それは、この問題にアプローチする最良の方法で私たちの現在の考え方です。考慮すべき代替アプローチはありますか?
再帰CTEでスカラー関数が使用されている場合、結果セット内のすべての行の監査ログにクエリが書き込まれることに気付きました。
ベンダーが提供するいくつかのスカラー値関数がありますが、それらを削除したり、代替データベースに移動したりすることはできません。
We've found that some queries will write to the audit log the use of a scalar function for every row in a result set.
-これは、私が今まで聞いた中で最も素晴らしいスカラーUDFの副作用の1つであり、多くのことを聞いたことがあります。