CREATE DATABASE vs. CREATE ANY DATABASE-Berechtigungen

21

Worin besteht der Unterschied zwischen den Berechtigungen CREATE DATABASEund in Microsoft SQL Server CREATE ANY DATABASE?

Ich kann keine verbindliche Antwort finden. Das Beste, woraus ich schließen kann, ist, dass entweder (a) CREATE ANYimpliziert, dass ich die Datenbank erstellen kann, die einem anderen Benutzer gehört, wohingegen CREATEich dies nicht kann, oder (b) die ursprüngliche Berechtigung in den Tagen von Sybase / SQL Server war CREATE ANYund CREATEfür die ein Alias ​​besteht ANSI-Konformität.

Tohuw
quelle
Echo, was Aaron sagte, +1, aber Sie sollten die Bearbeitung wirklich ausschneiden, als Antwort einfügen und dann akzeptieren. Zwei Gründe: Es verdeutlicht, was die Antwort ist (und Ihre Bearbeitung ist eine großartige Antwort) und es ist auch ordentlicher (unbeantwortete Fragen werden gelegentlich nach oben geschleudert, um mehr Aufmerksamkeit zu erhalten).
Simon Righarts
1
Erledigt, aber ich kann es erst morgen annehmen, und ich konnte gestern überhaupt keine Antworten veröffentlichen (5-Stunden-Limit für die Selbstantwort für <100 Wiederholungen).
Tohuw

Antworten:

20

Ich glaube, ich habe die maßgebliche Antwort gefunden, die in hohem Maße durch die Tabelle in diesem Artikel 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 MSSQL-geschützte Serverberechtigung ist. Die beiden sind jedoch nicht gleich. In der Tat 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 überprüft 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 einigen Hauptsystemdatenbanken vergeben werden und Benutzern in dieser Datenbank Berechtigungen erteilt werden. Das Standardverhalten neuer Datenbanken besteht darin, den Master zu konsultieren, um festzustellen, welche Berechtigungen er erben soll. (SQL 101, ich weiß, aber es ist hier wirklich beispielhaft.)

Wenn Sie also CREATE DATABASE gewähren, 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 in master, gewähren Sie ihm create database, dann können Sie Datenbanken erstellen). Wenn Sie jedoch die Berechtigung zum Erstellen einer Datenbank (oder zum Gewähren der Rolle "dbcreator") erteilen, müssen Sie kein Literalbenutzer in master sein.

Um den Unterschied zwischen den beiden Berechtigungen weiter zu veranschaulichen, beobachten Sie die unterschiedlichen Meldungen, die durch Erteilen eines Benutzer CREATE DATABASE auf dem Master im Vergleich zu einer anderen Datenbank zurückgegeben werden. Spülen Sie dann die Berechtigung CREATE ANY DATABASE und wiederholen Sie sie.

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 master-Datenbank befindet. Dies ist eine Berechtigung auf Datenbankebene. Sie hat keinen Kontext, um außerhalb der ausgewählten Datenbank nach Anmeldungen oder Benutzern zu suchen. Wenn Sie den Benutzer zuerst in master erstellen, ist dieser Befehl erfolgreich und Sie können Datenbanken genauso erstellen, als ob CREATE ANY DATABASE Ihnen gewährt worden wäre.

use master; GRANT CREATE ANY DATABASE to TestUser

Befehl (e) erfolgreich ausgeführt.

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

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. Diese Fehlermeldung wird nicht angezeigt, 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 für den Serverbereich können nur erteilt werden, wenn die aktuelle Datenbank Master ist

Wie in der zweiten Abfrage gezeigt, durchsucht CREATE ANY DATABASE die Liste der Anmeldungen, bei denen ich diesen Anmeldenamen bereits erstellt habe. Obwohl SQL Server die Existenz des Benutzers bestätigt hat, tritt ein Fehler auf, da ich versuche, eine Berechtigung auf Serverebene an einer anderen Stelle als dem Master zu erteilen, die 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 sollten, falls vorhanden, verworfen werden.

Nachdem es nun einen Benutzer für CREATE DATABASE gibt, auf den sich CREATE DATABASE anwenden lässt, wird die generische Fehlermeldung angezeigt, dass Sie Berechtigungen auf Serverebene nur auf master-Ebene erteilen können, da SQL Server diese Berechtigungen dort speichert.

Nun, das hat Spaß gemacht.

Tohuw
quelle