В чем разница между разрешениями CREATE DATABASE
и CREATE ANY DATABASE
разрешениями в Microsoft SQL Server ?
Я не могу найти авторитетный ответ. Лучшее, что я могу сделать вывод, это то, что (а) CREATE ANY
подразумевает, что я могу создать базу данных, которая будет принадлежать другому пользователю, тогда как с помощью CREATE
я не могу, или (б) исходное разрешение в Sybase / ранние дни SQL Server было CREATE ANY
и CREATE
является псевдонимом для Соответствие ANSI.
sql-server
permissions
Tohuw
источник
источник
Ответы:
Я полагаю, что нашел авторитетный ответ, которому очень помогла таблица, представленная в этой статье: 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.
Эта ошибка возникает из-за того, что пользователь TestUser еще не находится в базе данных master. Это разрешение уровня базы данных - у него нет контекста, чтобы выходить за пределы выбранной базы данных и искать логины или пользователей. Обратите внимание, что если вы сначала создадите пользователя в master, эта команда будет выполнена успешно, и вы сможете создавать базы данных так же, как если бы CREATE ANY DATABASE была предоставлена вам.
Это успешно выполняется, поскольку в качестве проприетарного разрешения Microsoft SQL Server CREATE ANY DATABASE может обращаться к списку имен входа для экземпляра SQL, а не только к пользователям в используемой в данный момент базе данных.
Это демонстрирует последовательность моего объяснения для первого примера. Обратите внимание на приведенный ниже запрос и его сообщение об ошибке. Вы не получите это сообщение об ошибке, если сначала создадите пользователя в этой базе данных (см. Последний запрос).
Как показано во втором запросе, CREATE ANY DATABASE просматривает список имен для входа, где я уже создал это имя для входа. Таким образом, хотя SQL Server подтвердил существование пользователя, он все еще выдает ошибку, потому что я пытаюсь предоставить разрешение уровня сервера где-то, кроме master, что не разрешено в MSSQL.
Теперь, когда есть пользователь, к которому CREATE DATABASE может обратиться, мне выдается общее сообщение об ошибке, что вы не можете давать разрешения уровня сервера нигде, кроме master, потому что именно там SQL Server хранит эти разрешения.
Ну, это было весело.
источник