СТВОРИТИ ДАТАБАЗУ проти СТВОРИТИ будь-які дозволи DATABASE


21

У Microsoft SQL Server, яка різниця між CREATE DATABASEта CREATE ANY DATABASEдозволами?

Я не можу знайти авторитетної відповіді. Найкраще, на що я можу зробити висновок, - це те, що (а) CREATE ANYозначає, що я можу створити базу даних, що належить іншому користувачеві, тоді як, якщо CREATEя не можу, або (b) оригінальний дозвіл у дні Sybase / раннього SQL Server був CREATE ANYі CREATEпсевдонім для Відповідність ANSI.


Наголошуючи сказане Аароном, +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, дозволити йому створити базу даних, тоді ви можете зробити бази даних). Однак, надаючи будь-яку базу даних (або надаючи роль 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 зберігає ці дозволи.

Ну, це було весело.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.