Problembeschreibung
Betrachten Sie das folgende Szenario:
-
Erstellen eine Richtlinie mit Policy-basiertem Management (PBM) in Microsoft SQL Server 2008, Microsoft SQL Server 2008 R2 oder Microsoft SQL Server 2012.
-
Evaluierungsmodus für die Richtlinie wird Auf Zeitplan.
-
Eine Bedingung für die Richtlinie enthält die ExecuteSql() -Funktion.
In diesem Szenario müssen Sie beim Ausführen des SQL Server-Agent-Auftrags der Agent generiert Fehlalarme und folgende Fehlermeldung wird in der SQL Server-Fehlerprotokolldatei protokolliert:
Fehler: 34052, Schweregrad: 16, Status: 1.
Richtlinie ' <Name der>' wurde verletzt.
Hinweis Dieses Problem tritt nicht auf, wenn Sie diesen Auftrag manuell ausführen.
Ursache
Dieses Problem tritt auf, weil eine erstellte PBM-Richtlinie verletzt wird. PBM legt Richtlinie Verstoß Nachrichten in das Fehlerprotokoll als ein Mechanismus für die Überwachung. Dies bedeutet, dass Sie die Serverkonfiguration, um zu ermitteln, warum die Richtlinie verletzt überprüfen sollten.
Die Verwendung der ExecuteSql() -Funktion im Rahmen der Ursache. Diese Funktion ermöglicht das Richtlinien zum Erstellen einer Bedingung ausgedrückt in Transact-SQL und Transact-SQL-Code in PBM kann auch ausgeführt werden. Deshalb standardmäßig der Code unter führt Sicherheitskontext ein gering privilegiertes Konto ## MS_PolicyTsqlExecutionLogin ##. Das Konto ## MS_PolicyTsqlExecutionLogin ## Berechtigungen für jede Datenbank Msdb -Datenbank nicht angegeben. Beim Ausführen ein geplanten Auftrags ist einer der ersten, die automatisch hinzugefügt Anweisung < > [DBName] verwenden . Diese Anweisung wird die richtlinienüberprüfung fehlschlägt.
Wenn Sie diesen Auftrag manuell ausführen, verwendet SQL Server die aktuellen Sicherheitskontext. Als Abfragen in der Berechtigung wird dieser Auftrag ordnungsgemäß ausgewertet.
PROBLEMUMGEHUNG
Um dieses Problem zu beheben, gewähren Sie dem Konto ## MS_PolicyTsqlExecutionLogin ## die erforderlichen Berechtigungen, um die erforderlichen Anweisungen ausgeführt.
Zum Beispiel reicht die public-Rolle für bestimmte Abfragen ausführen. Diese Rolle kann basierend auf Unternehmen und Richtlinien ggf. geändert werden. Allerdings ist es sehr unwahrscheinlich ändern, wie dies aus Sicherheitsgründen beabsichtigt.
Weitere Informationen
Weitere Informationen über die ExecuteSQL() -Funktion finden Sie auf der folgenden MSDN-Website: