CREATE DATABASE против CREATE ANY DATABASE разрешений

21

В чем разница между разрешениями CREATE DATABASEи CREATE ANY DATABASEразрешениями в Microsoft SQL Server ?

Я не могу найти авторитетный ответ. Лучшее, что я могу сделать вывод, это то, что (а) CREATE ANYподразумевает, что я могу создать базу данных, которая будет принадлежать другому пользователю, тогда как с помощью CREATEя не могу, или (б) исходное разрешение в Sybase / ранние дни SQL Server было CREATE ANYи CREATEявляется псевдонимом для Соответствие ANSI.

Tohuw
источник
Повторяя то, что сказал Аарон, +1, но вы действительно должны сократить редактирование, вставить его в качестве ответа, а затем принять его. Причины две: в нем разъясняется, что это за ответ (и ваша редакция - отличный ответ), а также он аккуратнее (оставшиеся без ответа вопросы иногда поднимаются наверх для большего внимания).
Саймон Райгарс
1
Готово, но я не могу принять его до завтра, и я не мог опубликовать ответы вообще вчера (5-часовой предел для самоответа для <100 повторений).
Tohuw

Ответы:

21

Я полагаю, что нашел авторитетный ответ, которому очень помогла таблица, представленная в этой статье: 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 хранит эти разрешения.

Ну, это было весело.

Tohuw
источник