34052 エラー メッセージと PBM は、SQL Serverの評価モードを持つポリシーに関するアラートを生成します

この記事は、ポリシー ベースの管理 (PBM) を使用するときに SQL エージェント ジョブで誤ったアラートが生成される問題を解決するのに役立ちます。

元の製品バージョン: SQL Server
元の KB 番号: 2923956

現象

次のような状況で問題が発生します。

  • SQL Serverで PBM を使用してポリシーを作成します。
  • ポリシーの評価モードは [スケジュール時] です。
  • ポリシーの条件の 1 つに 関数が ExecuteSql() 含まれています。

このシナリオでは、SQL Server エージェント ジョブが実行されると、エージェントによって誤ったアラートが生成され、次のエラー メッセージがSQL Serverエラー ログ ファイルに記録されます。

エラー: 34052、重大度: 16、状態: 1。
ポリシー '<ポリシー名>' に違反しました。

注:

この問題は、このジョブを手動で実行しても発生しません。

原因

この問題は、作成された PBM ポリシーに違反しているために発生します。 PBM は、ポリシー違反メッセージを追跡するための 1 つのメカニズムとしてエラー ログに配置します。 これは、サーバー構成を調べて、ポリシーに違反している理由を判断する必要があることを示します。

この問題は、ポリシー内の関数の ExecuteSql() 使用によって発生します。 この関数を使用すると、ポリシー作成者は Transact-SQL で表現された条件を作成でき、PBM 内で任意の Transact-SQL コードを実行することもできます。 そのため、既定では、コードが実行されるセキュリティ コンテキストは、特権の低いアカウント MS_PolicyTsqlExecutionLoginです。 アカウント MS_PolicyTsqlExecutionLoginには、データベースに加えて、データベースに対するmsdbアクセス許可は付与されません。 ただし、スケジュールされたジョブを実行すると、自動的に追加される最初のステートメントの 1 つは use [<DBName>] ステートメントです。 このステートメントにより、ポリシーチェックが失敗します。

このジョブを手動で実行すると、SQL Serverは現在のセキュリティ コンテキストを使用します。 ポリシーでクエリを実行するアクセス許可がある限り、このジョブは正しく評価されます。

回避策

この問題を解決するには、必要なステートメントを実行するために 、MS_PolicyTsqlExecutionLogin アカウントに正しい権限を付与します。

たとえば、パブリック ロールは、特定のクエリを実行するのに十分です。 このロールは、ビジネス ニーズと会社のポリシーに基づいて必要に応じて変更できます。 ただし、この動作はセキュリティ上の理由から意図されているため、変更する可能性はほとんどありません。