Serverweite Berechtigungen und verwaiste Benutzer

Ausgehend von der Fragestellung, einen Überblick über die Berechtigungen in den verschiedenen Datenbank eines Servers zu erstellen, fand ich die dahinter gelagerten Möglichkeiten auch recht reizvoll.

Nachdem ich bereits vor einigen Wochen ein kleines Skript gepostet habe, welches die Berechtigungen in einer Datenbank darstellt, kam jetzt die Anforderung auf, die Berechtigungen in allen Datenbanken eines ganzen Servers zu dokumentieren. Was lag da näher, als die undokumentierte Prozedur sp_MSforeachdb zu verwenden. Diese Prozedur befindet sich in der master-Datenbank und erwartet im einfachsten Falle einen Befehl, in dem das Fragezeichen als Platzhalter für den Datenbanknamen steht.

Beispielaufruf

exec sp_MSforeachdb @command1='use [?]; select db_name()'
Dieses Skript wechselt also zuerst den Datenbank-Kontext und ruft danach die Funktion zur Ermittlung des Datenbank-Namens auf.

Ermittlung der Berechtigungen

Hier deklariere ich zuerst eine Variable, der ich den Code der Abfrage zuweise und rufe danach die oben beschriebene Prozedur auf. Damit ich die Werte aber dauerhaft habe, lege ich vorher noch eine temporäre Tabelle an, die ich anschliessend für weitere Auswertungen verwenden kann. Hierbei fiel mir auf, dass in einigen Datenbanken WINDOWS_USER existieren, die Spalte Login aber NULL ist. Die Ursache war schnell gefunden: Das Login wurde auf dem Server gelöscht und der Benutzer blieb erhalten. Ähnliches kann auch passieren, wenn man eine Datenbank per Backup/Restore auf einen anderen Server bringt, wo nicht die gleichen Logins angelegt sind. Spontan fielen mir folgende Suchen ein:

  • WINDOWS_USER ohne Login
  • SQLUSER ohne Login
  • DBOs ohne Login

Ich denke, die Möglichkeiten dieser Sammlung werden schnell deutlich. Vielleicht fallen ja dem ein oder anderen noch interessante Ergänzungen ein, die er hier als Kommentar posten möchte.

  Berechtigungen in allen Datenbanken.sql