Wydaje mi się, że znalazłem autorytatywną odpowiedź, bardzo pomocną w tabeli podanej w tym artykule: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Wydaje się, że CREATE DATABASE jest rzeczywiście zgodnym z ANSI SQL uprawnieniem, podczas gdy CREATE ANY DATABASE jest zastrzeżonym prawem do serwera MSSQL. Jednak dwa nie są takie same. W rzeczywistości istnieje dość ważna różnica między nimi, a ja to odkryłem, próbując tego.
Oba są uprawnieniami, ale CREATE DATABASE sprawdza jedynie kontekst bezpieczeństwa aktualnie używanej bazy danych, podczas gdy CREATE ANY DATABASE może wyszukać listę loginów na serwerze SQL. Wydaje się, że zostało to zaimplementowane, ponieważ ogólne oczekiwanie na serwer ANSI SQL jest takie, że uprawnienia są przyznawane w głównej bazie danych systemu, a użytkownicy w tej bazie danych mają uprawnienia. Następnie domyślnym zachowaniem nowych baz danych jest skonsultowanie się z masterem, aby zobaczyć, jakie uprawnienia powinien odziedziczyć. (SQL 101, wiem, ale tutaj jest naprawdę przykładem).
Tak więc, kiedy udzielisz CREATE DATABASE, musisz mieć użytkownika nadrzędnego, aby udzielić tego uprawnienia. Jeśli spróbujesz tego, to zadziała (utwórz użytkownika w systemie głównym, utwórz go, utwórz bazę danych). Jednakże, przyznając utworzenie dowolnej bazy danych (lub przyznając rolę dbcreator), nie musisz być dosłownym użytkownikiem w systemie głównym.
Aby dodatkowo zilustrować różnicę między tymi dwoma uprawnieniami, obserwuj różne komunikaty zwracane przez udzielenie użytkownikowi UTWÓRZ BAZY DANYCH w bazie danych w porównaniu z inną bazą danych, a następnie spłucz i powtórz dla uzyskania pozwolenia UTWÓRZ DOWOLNĄ BAZĘ DANYCH.
use master; GRANT CREATE DATABASE to TestUser
Msg 15151, poziom 16, stan 1, wiersz 1 Nie można znaleźć użytkownika „TestUser”, ponieważ nie istnieje lub nie masz uprawnień.
Ten błąd występuje, ponieważ użytkownik TestUser nie znajduje się jeszcze w głównej bazie danych. Jest to uprawnienie na poziomie bazy danych - nie ma kontekstu, aby wyjść poza wybraną bazę danych i poszukać danych logowania lub użytkowników. Zauważ, że jeśli najpierw utworzysz użytkownika w trybie głównym, to polecenie się powiedzie i możesz utworzyć bazy danych tak, jakbyś utworzył TWOJĄ DOWOLNĄ BAZĘ DANYCH.
use master; GRANT CREATE ANY DATABASE to TestUser
Polecenia zostały wykonane pomyślnie.
Udaje się to, ponieważ jako zastrzeżone uprawnienia Microsoft SQL Server, UTWÓRZ DOWOLNĄ BAZĘ DANYCH może przeglądać listę loginów instancji SQL, a nie tylko użytkowników w aktualnie używanej bazie danych.
use test; GRANT CREATE DATABASE to TestUser
Msg 15151, poziom 16, stan 1, wiersz 1 Nie można znaleźć użytkownika „TestUser”, ponieważ nie istnieje lub nie masz uprawnień.
To pokazuje spójność mojego wyjaśnienia dla pierwszego przykładu. Zwróć uwagę na poniższe zapytanie i wynikowy komunikat o błędzie. Ten komunikat o błędzie nie zostanie wyświetlony, jeśli najpierw utworzysz użytkownika w tej bazie danych (patrz ostatnie zapytanie).
use test; GRANT CREATE ANY DATABASE to TestUser
Msg 4621, poziom 16, stan 10, wiersz 1 Uprawnienia w zakresie serwera można przyznać tylko wtedy, gdy bieżąca baza danych jest nadrzędna
Jak pokazano w drugim zapytaniu, UTWÓRZ DOWOLNĄ BAZĘ DANYCH sprawdza listę logowań, na której już utworzyłem tę nazwę logowania. Tak więc, chociaż SQL Server potwierdził istnienie użytkownika, nadal występuje błąd, ponieważ próbuję przyznać uprawnienia na poziomie serwera w innym miejscu niż master, co nie jest dozwolone w MSSQL.
use test; create user TestUser; grant create database to TestUser
Uprawnienie CREATE DATABASE można przyznać tylko w głównej bazie danych. Wiadomość 0, poziom 11, stan 0, wiersz 0 Wystąpił poważny błąd w bieżącym poleceniu. Ewentualne wyniki należy odrzucić.
Teraz, gdy istnieje użytkownik, do którego można zastosować aplikację CREATE DATABASE, otrzymuję ogólny komunikat o błędzie, że nie można nadać uprawnień na poziomie serwera nigdzie poza urządzeniem głównym, ponieważ to tutaj SQL Server przechowuje te uprawnienia.
To była dobra zabawa.