次の方法で共有


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

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

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

現象

以下のシナリオについて考えてみます。

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

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

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

Note

この問題は、このジョブを手動で実行する場合には発生しません。

原因

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

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

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

回避策

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

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