Я полагаю, что нашел авторитетный ответ, которому очень помогла таблица, представленная в этой статье: http://msdn.microsoft.com/en-us/library/ms178569.aspx . Казалось бы, CREATE DATABASE действительно является разрешением, совместимым с ANSI SQL, в то время как CREATE ANY DATABASE является разрешением MSSQL для собственного сервера. Тем не менее, два не то же самое. На самом деле, между ними есть довольно важное различие, и я выяснил это, попробовав это.
Они оба являются разрешениями, но CREATE DATABASE только проверяет контекст безопасности используемой в данный момент базы данных, в то время как CREATE ANY DATABASE может искать список имен входа на SQL Server. Похоже, это реализовано, потому что общее ожидание для сервера ANSI SQL состоит в том, что разрешения предоставляются некоторой основной системной базе данных, причем пользователям в этой базе данных предоставляются разрешения. Тогда стандартное поведение новых баз данных - обратиться к мастеру, чтобы узнать, какие разрешения он должен наследовать. (SQL 101, я знаю, но это действительно иллюстрируется здесь.)
Поэтому, когда вы предоставляете CREATE DATABASE, у вас должен быть пользователь в master, чтобы предоставить это разрешение. Если вы попробуете это, это сработает (создайте пользователя в master, предоставьте ему создание базы данных, затем вы сможете создать базы данных). Однако, предоставляя создать любую базу данных (или предоставляя роль dbcreator), вам не нужно быть буквальным пользователем в master.
Чтобы дополнительно проиллюстрировать разницу между этими двумя разрешениями, просмотрите отличающиеся сообщения, возвращаемые путем предоставления пользователю CREATE DATABASE на главной базе данных против другой базы данных, затем промойте и повторите для разрешения CREATE ANY DATABASE.
use master; GRANT CREATE DATABASE to TestUser
Сообщение 15151, уровень 16, состояние 1, строка 1 Не удается найти пользователя «TestUser», поскольку он не существует или у вас нет разрешения.
Эта ошибка возникает из-за того, что пользователь TestUser еще не находится в базе данных master. Это разрешение уровня базы данных - у него нет контекста, чтобы выходить за пределы выбранной базы данных и искать логины или пользователей. Обратите внимание, что если вы сначала создадите пользователя в master, эта команда будет выполнена успешно, и вы сможете создавать базы данных так же, как если бы CREATE ANY DATABASE была предоставлена вам.
use master; GRANT CREATE ANY DATABASE to TestUser
Команда (и) выполнена успешно.
Это успешно выполняется, поскольку в качестве проприетарного разрешения Microsoft SQL Server CREATE ANY DATABASE может обращаться к списку имен входа для экземпляра SQL, а не только к пользователям в используемой в данный момент базе данных.
use test; GRANT CREATE DATABASE to TestUser
Сообщение 15151, уровень 16, состояние 1, строка 1 Не удается найти пользователя «TestUser», поскольку он не существует или у вас нет разрешения.
Это демонстрирует последовательность моего объяснения для первого примера. Обратите внимание на приведенный ниже запрос и его сообщение об ошибке. Вы не получите это сообщение об ошибке, если сначала создадите пользователя в этой базе данных (см. Последний запрос).
use test; GRANT CREATE ANY DATABASE to TestUser
Сообщение 4621, уровень 16, состояние 10, строка 1 Разрешения в области сервера могут предоставляться только в том случае, если текущая база данных является главной
Как показано во втором запросе, CREATE ANY DATABASE просматривает список имен для входа, где я уже создал это имя для входа. Таким образом, хотя SQL Server подтвердил существование пользователя, он все еще выдает ошибку, потому что я пытаюсь предоставить разрешение уровня сервера где-то, кроме master, что не разрешено в MSSQL.
use test; create user TestUser; grant create database to TestUser
Разрешение CREATE DATABASE может быть предоставлено только в базе данных master. Сообщение 0, уровень 11, состояние 0, строка 0 Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, должны быть отброшены.
Теперь, когда есть пользователь, к которому CREATE DATABASE может обратиться, мне выдается общее сообщение об ошибке, что вы не можете давать разрешения уровня сервера нигде, кроме master, потому что именно там SQL Server хранит эти разрешения.
Ну, это было весело.