Wie erstelle ich eine schreibgeschützte Serverrolle in SQL Server 2012?


15

Ich erteile die Berechtigung "Alle Datenbanken anzeigen" beim Erstellen einer neuen Serverrolle, habe jedoch festgestellt, dass diese Berechtigung nur dem Benutzer das Anzeigen der Systemdatenbanken ermöglicht.

Ich versuche, eine Serverrolle zu erstellen, die schreibgeschützt ist und jede Datenbank lesen kann.

Gibt es eine Möglichkeit, eine benutzerdefinierte Serverrolle zum Lesen von Benutzerdatenbanken zu erstellen? Oder muss ich dies durch Benutzerzuordnung pro Benutzer tun?

Antworten:


16

Dies als Antwort zu posten, nur weil es zu lang für einen Kommentar ist und weil es bald für andere Benutzer relevant sein wird.

SQL Server 2014 fügt einige neue Berechtigungen auf Serverebene hinzu, die genau diese Art von Szenario unterstützen. Sie wurden unter Berücksichtigung der Überwachung entwickelt, aber diese Art von Anforderung scheint auch für diese Rechnung geeignet zu sein. Sie können einem Login auf Serverebene einfach die folgenden zwei Berechtigungen hinzufügen:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Ersteres ermöglicht dem Login, wie es sich anhört, eine Verbindung zu einer beliebigen Datenbank herzustellen. Das Schöne daran ist, dass dies auch für Datenbanken möglich ist, die in Zukunft erstellt werden (vorausgesetzt, Sie legen keine explizite Ablehnung fest, wodurch Sie bestimmte Benutzerdatenbanken vor Anmeldungen mit dieser Berechtigung schützen können). Letzteres ermöglicht dem Login, Lesevorgänge für jede Datenbank auszuführen, auf die er Zugriff hat - also für SELECTTabellen, Ansichten, UDFs usw., aber sie können keine UPDATEVorgänge ausführen (ich habe nicht getestet, ob diese Berechtigung versteht, wann a gespeicherte Prozedur führt DML durch). Diese funktionieren in Kombination hervorragend, wenn Sie einem Login einen offenen Lesezugriff auf den gesamten Server gewähren möchten, oder wenn Sie differenzierter vorgehen möchten, können Sie CONNECTbestimmten Datenbanken herkömmliche Berechtigungen gewähren , und das SELECT ALL USER SECURABLESwird auch der Fall seinFunktioniert nur für Datenbanken, auf die der Login explizit Zugriff hat.

Die Sicherheitsänderungen von 2014 werden hier dokumentiert - nun, teilweise; Sie haben die Berechtigung auf Datenbankebene vergessen ALTER ANY DATABASE EVENT SESSION- obwohl dies hier nicht relevant ist.


Vielen Dank für diese erweiterte Antwort für die nächsten Server. Da diese Operation / Prüfung auf Serverebene stattfindet. Gibt es irgendwelche Kommentare zu der DB-Kompatibilitätsstufe. Wenn der DB CL also 2012 ist, funktioniert die 2014-Funktion dann noch?
SnapJag

Die Kompatibilitätsstufe von @SnapJag hat keinen Einfluss auf die Sicherheitsfunktionen. Hauptsächlich geht es darum, wie T-SQL analysiert wird und wie das Optimierungsprogramm Abfragepläne generiert.
Aaron Bertrand

@AaronBertrand Wissen Sie, ob es eine Berechtigung gibt, die wir für Rollen auf Serverebene festlegen können, um auch Aktualisierungen für jede Datenbank zuzulassen? (Sysadmin feste Rolle kann sicher, aber können wir es für eine benutzerdefinierte Serverrolle tun?)
MaxiWheat

@MaxiWheat Nein, ich kann mir keine triviale Möglichkeit vorstellen, das zu tun.
Aaron Bertrand

FWIW funktioniert dies nicht für Azure SQL-Datenbanken. GRANT CONNECT ANY DATABASE TO [NameOfUserOrGroup] Die sicherungsfähige Klasse 'Server' wird in dieser Version von SQL Server nicht unterstützt.
Dzejms

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.