Credo di aver trovato la risposta autorevole, molto aiutata dalla tabella fornita in questo articolo: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Sembrerebbe che CREATE DATABASE sia effettivamente l'autorizzazione conforme ANSI SQL, mentre CREATE ANY DATABASE è un'autorizzazione del server proprietario MSSQL. Tuttavia, i due non sono gli stessi. In effetti, esiste una distinzione piuttosto importante tra i due, e l'ho scoperto provandolo.
Sono entrambe le autorizzazioni, ma CREATE DATABASE consulta solo il contesto di sicurezza del database attualmente utilizzato, mentre CREATE ANY DATABASE può cercare l'elenco di accessi su SQL Server. Questo sembra essere implementato perché l'aspettativa generale per un server SQL ANSI è che le autorizzazioni siano conferite in alcuni database di sistema principali, con autorizzazioni per gli utenti di quel database. Quindi il comportamento predefinito dei nuovi database è consultare il master per vedere quali autorizzazioni deve ereditare. (SQL 101, lo so, ma è davvero esemplificato qui.)
Pertanto, quando concedi CREATE DATABASE, devi effettivamente disporre di un utente master per concedere questa autorizzazione. Se provi questo, funziona (crea un utente nel master, concedi che crei database, quindi puoi creare database). Tuttavia, concedendo creare qualsiasi database (o concedendo il ruolo dbcreator), non è necessario essere un utente letterale nel master.
Per illustrare ulteriormente la differenza tra le due autorizzazioni, osservare i diversi messaggi restituiti concedendo a un utente CREATE DATABASE sul master rispetto a un altro database, quindi risciacquare e ripetere per l'autorizzazione CREATE ANY DATABASE.
use master; GRANT CREATE DATABASE to TestUser
Messaggio 15151, livello 16, stato 1, riga 1 Impossibile trovare l'utente "TestUser" perché non esiste o non si dispone dell'autorizzazione.
Questo errore si verifica perché l'utente TestUser non è ancora nel database principale. Questa è un'autorizzazione a livello di database: non ha contesto per uscire dal database selezionato e cercare accessi o utenti. Notare che se si crea prima l'utente nel master, questo comando ha esito positivo e si possono creare database proprio come se CREATE ANY DATABASE fosse stato concesso all'utente.
use master; GRANT CREATE ANY DATABASE to TestUser
Comandi completati correttamente.
Ciò ha esito positivo poiché, come autorizzazione proprietaria di Microsoft SQL Server, CREATE ANY DATABASE può consultare l'elenco degli accessi per l'istanza SQL, non solo gli utenti nel database attualmente utilizzato.
use test; GRANT CREATE DATABASE to TestUser
Messaggio 15151, livello 16, stato 1, riga 1 Impossibile trovare l'utente "TestUser" perché non esiste o non si dispone dell'autorizzazione.
Ciò dimostra la coerenza della mia spiegazione per il primo esempio. Notare la query seguente e il relativo messaggio di errore risultante. Questo messaggio di errore non verrà visualizzato se si crea l'utente per la prima volta in questo database (vedere l'ultima query).
use test; GRANT CREATE ANY DATABASE to TestUser
Messaggio 4621, livello 16, stato 10, riga 1 Le autorizzazioni nell'ambito del server possono essere concesse solo quando il database corrente è master
Come mostrato nella seconda query, CREATE ANY DATABASE consulta l'elenco degli accessi, dove avevo già creato questo nome di accesso. Quindi, sebbene SQL Server abbia riconosciuto l'esistenza dell'utente, continua a sbagliare perché sto tentando di concedere un'autorizzazione a livello di server da qualche parte diversa dal master, che non è consentita in MSSQL.
use test; create user TestUser; grant create database to TestUser
L'autorizzazione CREATE DATABASE può essere concessa solo nel database master. Messaggio 0, livello 11, stato 0, riga 0 Si è verificato un errore grave nel comando corrente. I risultati, se presenti, devono essere eliminati.
Ora che esiste un utente a cui applicare CREATE DATABASE, mi viene dato il messaggio di errore generico che non è possibile concedere autorizzazioni a livello di server in qualsiasi luogo tranne che in quello principale, poiché SQL Server memorizza tali autorizzazioni.
Bene, è stato divertente.