Ich habe ein merkwürdiges Berechtigungsproblem. Kürzlich ist etwas passiert, das dazu geführt hat, dass vorhandene SQL Server-Agent-Jobs, die für die Ausführung als bestimmter Benutzer konfiguriert wurden, nicht mehr funktionieren. Sie arbeiteten zuvor; Sie werfen jetzt grundlegende Berechtigungsfehler aus (z. B. SELECT-Berechtigung verweigert).
Hier ist ein spezifischer Testfall. Der Benutzer johndoe
hat die sysadmin
Rolle auf Serverebene. Die folgende Abfrage funktioniert einwandfrei, wenn sie johndoe
in SQL Server Management Studio ausgeführt wird:
select * from TableA into TableB
Wenn ich jedoch genau dieselbe Abfrage in einen einstufigen SQL Server-Agent-Job einfüge, wobei dieser Schritt so konfiguriert ist, dass er als Benutzer ausgeführt johndoe
wird, wird der folgende Fehler angezeigt.
Als Benutzer ausgeführt: johndoe. Die SELECT-Berechtigung wurde für das Objekt 'TableA', Datenbank 'MyDatabase', Schema 'dbo' verweigert. [SQLSTATE 42000] (Fehler 229). Der Schritt ist fehlgeschlagen.
Irgendwelche Vorschläge, was diese scheinbar spontane Veränderung verursacht haben könnte?
msdb
, um Agent-Jobs auszuführen?Antworten:
Haben Sie überprüft, welcher SQL-Benutzer die Abfrage tatsächlich ausführt? Abhängig von der Berechtigungsstufe erlaubt SQL Agent dem Benutzer möglicherweise, sich als Konto einer höheren Ebene auszugeben.
Erstellen Sie einen Job mit dem T-SQL-Schritt:
Erstellen Sie eine Protokollausgabe in einer Tabelle oder Textdatei und überprüfen Sie, welcher Benutzer die endgültige Abfrage tatsächlich ausführt. Wenn es nicht der Benutzer ist, von dem Sie denken, dass er es sein sollte, müssen Sie zurückverfolgen, um herauszufinden, woher der Identitätswechsel kommt.
Ich habe Probleme mit CRM Dynamics-Datenbanken mit gefilterten Ansichten festgestellt, in denen bestimmte CRM-Benutzer ihre gefilterten Daten sehen können. Wenn der Job einen Systemkonto-Identitätswechsel verwendet, werden keine Daten zurückgegeben, da das Systemkonto als CRM-Benutzer nicht vorhanden ist.
quelle
Der EXECUETE AS-Kontext ist ein Benutzerkontext , kein Anmeldekontext . Als solches fällt es unter die Einschränkungen des EXECUTE AS-Sandboxing, siehe Erweitern des Datenbankidentitätswechsels durch Verwenden von EXECUTE AS :
Insbesondere würde es keine von der Gruppenmitgliedschaft auf Serverebene abgeleitete Berechtigung erben, es sei denn, die Datenbank ist als vertrauenswürdig markiert . Sie können entweder
[MyDatabase]
als vertrauenswürdig markieren (wodurch jedes db_owner-Mitglied[MyDatabase]
eines De-facto-Mitglieds von sysadmin mit allen Auswirkungen wird) oder dem Benutzer[johndoe]
in explizit Berechtigungen erteilen[MyDatabase]
.quelle