it-swarm-eu.dev

CREATE DATABASE vs. CREATE ANY DATABASE-Berechtigungen

Was ist in Microsoft SQL Server der Unterschied zwischen CREATE DATABASE und CREATE ANY DATABASE Berechtigungen?

Ich kann keine maßgebliche Antwort finden. Das Beste, worauf ich schließen kann, ist, dass entweder (a) CREATE ANY impliziert, dass ich die Datenbank erstellen kann, die einem anderen Benutzer gehört, wohingegen ich mit CREATE dies nicht kann oder (b) die ursprüngliche Berechtigung in den Tagen von Sybase/frühen SQL Server war CREATE ANY und CREATE ist auf ANSI-Konformität ausgerichtet.

22
Tohuw

Ich glaube, ich habe die maßgebliche Antwort gefunden, die durch die in diesem Artikel bereitgestellte Tabelle erheblich unterstützt wird: http://msdn.Microsoft.com/en-us/library/ms178569.aspx . Es scheint, dass CREATE DATABASE tatsächlich die ANSI SQL-kompatible Berechtigung ist, während CREATE ANY DATABASE eine proprietäre MSSQL-Serverberechtigung ist. Die beiden sind jedoch nicht gleich. Tatsächlich gibt es einen ziemlich wichtigen Unterschied zwischen den beiden, und ich habe dies herausgefunden, indem ich es ausprobiert habe.

Sie sind beide Berechtigungen, aber CREATE DATABASE konsultiert nur den Sicherheitskontext der aktuell verwendeten Datenbank, während CREATE ANY DATABASE die Liste der Anmeldungen auf dem SQL Server nachschlagen kann. Dies scheint implementiert zu sein, da die allgemeine Erwartung für einen ANSI-SQL-Server darin besteht, dass Berechtigungen in einer Hauptsystemdatenbank erteilt werden, wobei Benutzern in dieser Datenbank Berechtigungen erteilt werden. Das Standardverhalten neuer Datenbanken besteht darin, den Master zu konsultieren, um festzustellen, welche Berechtigungen er erben sollte. (SQL 101, ich weiß, aber es ist hier wirklich beispielhaft.)

Wenn Sie also CREATE DATABASE erteilen, müssen Sie tatsächlich einen Benutzer im Master haben, dem Sie diese Berechtigung erteilen können. Wenn Sie dies versuchen, funktioniert es (erstellen Sie einen Benutzer im Master, gewähren Sie ihm Datenbank erstellen, dann können Sie Datenbanken erstellen). Wenn Sie jedoch das Erstellen einer Datenbank (oder das Gewähren der Rolle dbcreator) gewähren, müssen Sie kein Literalbenutzer im Master sein.

Um den Unterschied zwischen den beiden Berechtigungen weiter zu veranschaulichen, beachten Sie die unterschiedlichen Nachrichten, die zurückgegeben werden, indem Sie einem Benutzer CREATE DATABASE auf dem Master gegenüber einer anderen Datenbank erteilen. Spülen Sie dann die Berechtigung CREATE ANY DATABASE aus und wiederholen Sie den Vorgang.

use master; GRANT CREATE DATABASE to TestUser

Meldung 15151, Ebene 16, Status 1, Zeile 1 Der Benutzer 'TestUser' kann nicht gefunden werden, da er nicht vorhanden ist oder Sie keine Berechtigung haben.

Dieser Fehler tritt auf, weil sich der Benutzer TestUser noch nicht in der Masterdatenbank befindet. Dies ist eine Berechtigung auf Datenbankebene. Sie hat keinen Kontext, um außerhalb der ausgewählten Datenbank nach Anmeldungen oder Benutzern zu suchen. Beachten Sie, dass dieser Befehl erfolgreich ist, wenn Sie den Benutzer zuerst im Master erstellen, und Sie Datenbanken so erstellen können, als ob Ihnen CREATE ANY DATABASE gewährt wurde.

use master; GRANT CREATE ANY DATABASE to TestUser

Befehl (e) erfolgreich abgeschlossen.

Dies ist erfolgreich, da CREATE ANY DATABASE als proprietäre Microsoft SQL Server-Berechtigung die Liste der Anmeldungen für die SQL-Instanz einsehen kann, nicht nur die Benutzer in der aktuell verwendeten Datenbank.

use test; GRANT CREATE DATABASE to TestUser

Meldung 15151, Ebene 16, Status 1, Zeile 1 Der Benutzer 'TestUser' kann nicht gefunden werden, da er nicht vorhanden ist oder Sie keine Berechtigung haben.

Dies zeigt die Konsistenz meiner Erklärung für das erste Beispiel. Beachten Sie die folgende Abfrage und die daraus resultierende Fehlermeldung. Sie erhalten diese Fehlermeldung nicht, wenn Sie den Benutzer zum ersten Mal in dieser Datenbank erstellen (siehe letzte Abfrage).

use test; GRANT CREATE ANY DATABASE to TestUser

Meldung 4621, Ebene 16, Status 10, Zeile 1 Berechtigungen im Serverbereich können nur erteilt werden, wenn die aktuelle Datenbank Master ist

Wie in der zweiten Abfrage gezeigt, konsultiert CREATE ANY DATABASE die Liste der Anmeldungen, bei denen ich diesen Anmeldenamen bereits erstellt habe. Während SQL Server die Existenz des Benutzers bestätigt hat, tritt dennoch ein Fehler auf, da ich versuche, eine Berechtigung auf Serverebene an einem anderen Ort als Master zu erteilen, was in MSSQL nicht zulässig ist.

use test; create user TestUser; grant create database to TestUser

Die Berechtigung CREATE DATABASE kann nur in der Master-Datenbank erteilt werden. Meldung 0, Ebene 11, Status 0, Zeile 0 Beim aktuellen Befehl ist ein schwerwiegender Fehler aufgetreten. Die Ergebnisse, falls vorhanden, sollten verworfen werden.

Nachdem es nun einen Benutzer gibt, auf den CREATE DATABASE angewendet werden kann, wird die allgemeine Fehlermeldung angezeigt, dass Sie nur auf Master-Ebene Berechtigungen erteilen können, da SQL Server diese Berechtigungen dort speichert .

Nun, das hat Spaß gemacht.

22
Tohuw