Я вважаю, що я знайшов авторитетну відповідь, про що дуже допомогла таблиця, наведена в цій статті: 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, дозволити йому створити базу даних, тоді ви можете зробити бази даних). Однак, надаючи будь-яку базу даних (або надаючи роль dbcreator), вам не потрібно бути буквальним користувачем у master.
Щоб додатково проілюструвати різницю між двома дозволами, спостерігайте за різними повідомленнями, поверненими, надавши користувачеві CREATE DATABASE на головній та іншій базі даних, після чого промийте та повторіть для дозволу СТВОРИТИ БУДЬ-ЯКУ ДАНІ.
use master; GRANT CREATE DATABASE to TestUser
Msg 15151, рівень 16, стан 1, рядок 1 Неможливо знайти користувача "TestUser", оскільки він не існує або у вас немає дозволу.
Ця помилка трапляється через те, що користувач TestUser ще не знаходиться в головній базі даних. Це дозвіл на рівні бази даних - у нього немає контексту виходити за межі вибраної бази даних та шукати входу або користувачів. Зауважте, що якщо ви спершу створюєте користувача у програмі master, ця команда буде успішною, і ви можете створювати бази даних так само, як якщо б СТВОРИТИСЯ БУДЬ-ЯКУ ДАНИХ
use master; GRANT CREATE ANY DATABASE to TestUser
Команди (и) успішно виконані.
Це досягається успіху, оскільки, як власний дозвіл Microsoft SQL Server, СТВОРИТИСЯ БУДЬ-ЯКУ ДАТАБАСУ можна ознайомитись зі списком входів для екземпляра SQL, а не лише користувачів у використовуваній базі даних.
use test; GRANT CREATE DATABASE to TestUser
Msg 15151, рівень 16, стан 1, рядок 1 Неможливо знайти користувача "TestUser", оскільки він не існує або у вас немає дозволу.
Це демонструє послідовність мого пояснення для першого прикладу. Зверніть увагу на нижченаведений запит та його відповідне повідомлення про помилку. Ви не отримаєте це повідомлення про помилку, якщо спершу створите користувача в цій базі даних (див. Останній запит).
use test; GRANT CREATE ANY DATABASE to TestUser
Msg 4621, Рівень 16, стан 10, рядок 1 Дозволи на область сервера можна надати лише тоді, коли поточна база даних є головним
Як показано у другому запиті, CREATE ANY DATABASE звертається до списку входів, де я вже створив це ім’я для входу. Отже, хоча SQL Server визнав існування користувача, він все ще помиляється, тому що я намагаюся надати дозвіл на рівні сервера де-небудь, крім головного, що не дозволено в MSSQL.
use test; create user TestUser; grant create database to TestUser
Дозвіл CREATE DATABASE може бути наданий лише у головній базі даних. Повідомлення 0, рівень 11, стан 0, рядок 0 У поточній команді сталася сильна помилка. Результати, якщо такі є, слід відмовитися.
Тепер, коли є користувач для CREATE DATABASE, до якого можна звернутися, мені видається загальне повідомлення про помилку, що ви не можете давати дозволи на рівні сервера ніде, крім головного, тому що саме там SQL Server зберігає ці дозволи.
Ну, це було весело.