Інструкція GRANT
Інструкція GRANT надає дозволу принципалам на захищаються об'єкти. Ця інструкція має наступний синтаксис:
Пропозиція ALL означає, що вказаною принципалу надаються згідно з усіма до зазначеного захищається дозволу. У параметрі permission_list вказуються вирішуються інструкції або об'єкти (розділені комами), а в параметрі class - клас або ім'я об'єкта, що захищається, для якого надаються дозволи. Пропозиція on securable вказує, що захищається, на який надається дозвіл. У параметрі prinicpal_list перераховуються всі облікові записи (розділені комами), яким надаються дозволи. Параметр principal і складові списку principal_list можуть бути обліковим записом користувача Windows, реєстраційним ім'ям або обліковим записом користувача, зіставленої з сертифікатом, реєстраційним ім'ям, співставленим з асиметричним ключем, користувачем бази даних, роллю бази даних або роллю додатка.
У таблиці нижче приводяться дозволу і захищаються об'єкти, до яких вони застосовуються, а також короткий опис наданих кожним дозволом можливостей:
Дозволи та відповідні захищаються об'єкти
Надає можливість створювати захищені об'єкти бази даних
У таблиці перераховані тільки найбільш важливі дозволу. Так як модель безпеки компонента Database Engine є ієрархічною, то вона містить багато гранулярні дозволу, які не відображені в списку. Опис цих дозволів дивіться в електронній документації.
Застосування інструкції GRANT показано в прикладах нижче. Для початку, в наступному прикладі показано використання дозволу CREATE:
У цьому прикладі користувачам Vasya і [ProfessorWeb \ Alexandr] дається право на виконання інструкцій мови Transact-SQL CREATE TABLE і CREATE PROCEDURE. (Як можна бачити в цьому прикладі, інструкція GRANT для вирішення CREATE не включає параметр ON.)
У прикладі нижче користувачеві Vasya надається можливість для створення визначених користувачем функцій в базі даних SampleDb:
Далі показано використання дозволу SELECT в інструкції GRANT:
Тут користувач Vasya отримує дозвіл на читання рядків з таблиці Employee. Коли дозвіл дається облікового запису користувача Windows або реєстраційного імені, це дозвіл поширюється тільки на цей обліковий запис (реєстраційне ім'я). З іншого боку, дозвіл, наданий групі або ролі, поширюється на всіх користувачів даної групи або ролі.
У прикладі нижче показано використання дозволу UPDATE в інструкції GRANT:
Після виконання інструкції GRANT в цьому прикладі нижче, користувач Vasya може модифікувати значення стовпців Id і EnterDate таблиці Works_on.
У наступному прикладі показано використання дозволу VIEW DEFINITION, яке надає користувачам доступ для читання метаданих:
У прикладі нижче показано використання дозволу CONTROL:
Тут користувачеві Vasya надаються, по суті, все певні права доступу до захищається (в даному випадку до бази даних SampleDb). Принципалу, якому надано дозвіл CONTROL для об'єкта, що захищається, також неявно надається можливість самому надавати дозволи для даного об'єкта. Іншими словами, дозвіл CONTROL включає в себе пропозицію WITH GRANT OPTION. Дозвіл CONTROL є найвищим дозволом, стосовно до багатьох захищених об'єктів бази даних. Внаслідок цього, дозвіл CONTROL на рівні певної галузі неявно включає дозвіл CONTROL для всіх об'єктів, що захищаються в цій області. Тому дозвіл CONTROL користувача Vasya для бази даних SampleDb неявно включає в себе всі дозволи до цієї бази даних, а також всі дозволи до всіх збірок цієї бази даних, всі дозволи до всіх схемами і об'єктів бази даних.
За замовчуванням, якщо користувач A надає дозвіл користувачеві B, то користувач B може використовувати дозволу при виконанні інструкцій мови Transact-SQL в інструкції GRANT. Пропозиція WITH GRANT OPTION дає користувачеві B додаткову можливість надавати даний дозвіл іншим користувачам:
У цьому прикладі користувачеві Vasya надається дозвіл виконувати інструкцію SELECT для вибірки рядків з таблиці Works_on, а також право самому надавати цей дозвіл іншим користувачам бази даних SampleDb.
Інструкція DENY
Інструкція DENY забороняє користувачеві виконувати зазначені дії на зазначених об'єктах. Іншими словами, ця інструкція видаляє існуючі дозволи для облікового запису користувача, а також запобігає отриманню дозволів користувачем за допомогою його членства в групі або ролі, яку він може отримати в майбутньому. Ця інструкція має наступний синтаксис:
Всі параметри інструкції DENY мають точно таке ж логічне значення, як і однойменні параметри інструкції GRANT. Інструкція DENY має додатковий параметр CASCADE. в якому вказується, що дозволу, заборонені користувачеві A, будуть також заборонені користувачам, яким він їх надав. Якщо в інструкції DENY параметр CASCADE опущений, і при цьому раніше були надані дозволи для відповідного об'єкта з використанням пропозиції WITH GRANT OPTION, виконання інструкції DENY завершується помилкою.
Інструкція DENY блокує дозволу, отримані користувачем, групою або роллю допомогою їх членства в групі або ролі. Це означає, що якщо член групи, яким заборонено дозвіл, наданий для групи, то цей користувач буде єдиним з групи, хто не зможе використовувати цей дозвіл. З іншого боку, якщо дозвіл заборонено для всієї групи, всі члени цієї групи не зможуть користуватися цим дозволом.
Використання інструкції DENY показано в прикладах нижче. У наступному прикладі ми забороняємо користувачеві Vasya два наданих раніше дозволу:
Спочатку надається дозвіл на вибірку всіх рядків з таблиці Project всім користувачам бази даних SampleDb. Після цього цей дозвіл скасовується для користувача Vasya.
Заборона дозволів на більш високому рівні моделі безпеки компонента Database Engine анулює дозволи, надані на більш низькому рівні. Наприклад, якщо дозвіл SELECT заборонено на рівні бази даних SampleDb, і цей дозвіл передбачається для таблиці Employee, в результаті чого дозвіл SELECT буде заборонено для таблиці Employee так само, як і для всіх інших таблиць цієї бази даних.
Інструкція REVOKE
Інструкція REVOKE видаляє надане або заборонене раніше дозвіл. Ця інструкція має наступний синтаксис:
Єдиним новим параметром інструкції REVOKE є параметр GRANT OPTION FOR. Всі інші параметри цієї інструкції мають точно таке ж логічне значення, як і однойменні параметри інструкцій GRANT або DENY. Параметр GRANT OPTION FOR використовується для скасування ефекту пропозиції WITH GRANT OPTION у відповідній інструкції GRANT. Це означає, що користувач все ще буде мати надані раніше дозволи, але більше не зможе надавати їх іншим користувачам.
Інструкція REVOKE скасовує як "позитивні" дозволу, надані інструкцією GRANT, так і "негативні" дозволу, надані інструкцією DENY. Таким чином, його функцією є нейтралізація зазначених раніше дозволів (позитивних і негативних).
Використання інструкції REVOKE показано в прикладі нижче:
Інструкція REVOKE в цьому прикладі скасовує наданий дозвіл вибірки даних для ролі public. При цьому існуюче заборона вирішення цієї інструкції для користувача Vasya не видаляється, оскільки дозволу, надані або заборонені явно членам групи (або ролі), не будуть зачіпатися видаленням цих дозволів (позитивних або негативних) для даної групи.
Управління дозволами за допомогою середовища Management Studio
Для управління дозволами за допомогою середовища Management Studio розгорніть сервер, а потім папку "Databases". Клацніть правою кнопкою миші необхідну базу даних і в контекстному меню виберіть пункт Properties. У діалоговому вікні властивостей бази даних Database Properties - SampleDb виберіть сторінку Permissions, після чого натисніть кнопку Search, щоб вибрати користувачів, яким надати або заборонити дозволу. У діалоговому вікні натисніть кнопку Browse, в діалоговому вікні Browse for Objects виберіть потрібних користувачів або ролі (наприклад, guest і public) і натисніть кнопки ОК відповідних вікон, щоб додати вибраних користувачів (ролі).
Обрані таким чином користувачі будуть відображені у вікні властивостей бази даних в поле Users or roles (Користувачі і ролі).
Тепер для обраних користувачів можна дозволити або заборонити виконання певних дій. Зокрема, для надання дозволу, для необхідного дії встановіть прапорець в стовпці Grant, а для заборони дії встановіть для нього прапорець в стовпці Deny. Встановлений прапорець в стовпці With Grant означає, що одержувач дозволу також має право надавати його іншим користувачам. Відсутність встановлених прапорців в стовпці дозволів або заборон означає, що для даного користувача немає ніяких явних дозволів або заборон на виконання відповідних дій.
Надання і заборона дозволів користувачам або ролям для виконання дій з індивідуальними таблицями бази даних за допомогою середовища Management Studio здійснюється точно так же, як і для всієї бази даних: в браузері об'єктів Object Explorer розгортається вся ієрархія папок сервера аж до необхідної таблиці, відкривається вікно властивостей цієї таблиці, вибираються і додаються в поле Users or roles необхідні користувачі, після чого їм надаються або забороняються необхідні дозволи на виконання певних дій установкою спо тветствующіх прапорців:
Використання обмежень через уявлення
Накладення обмеження на використання певних стовпців і / або рядків означає, що механізм подання забезпечує управління доступом до даних. Наприклад, якщо таблиця Employee містить також стовпець з інформацією про ставку співробітників, тоді доступ до цього стовпцю можна обмежити, використовуючи уявлення, яке відображає всі стовпці таблиці за винятком стовпця ставок. Подібним чином дозвіл на таку обмежену вибірку даних з таблиці можна надати всім користувачам бази даних, використовуючи дане подання, тоді як тільки невелике число користувачів (що мають підвищені права) матимуть право на доступ до всіх даних таблиці.
У наступних трьох прикладах показано використання уявлень для обмеження доступу до даних. У наступному прикладі ми додаємо обмеження доступу до таблиці Project її двома стовпцями:
Як показано в прикладі нижче, уявлення view_without дозволяє розділити користувачів на дві групи: тих, хто може переглядати бюджети всіх проектів, і тих, для яких доступ до колонку Budget таблиці Projects не надається.
У цьому прикладі модифікується схема таблиці Employee, додаючи в неї новий стовпець user_name. Тепер при кожній вставці рядка в цю таблицю в стовпець user_name вставляється реєстраційне ім'я користувача, який здійснює цю вставку. Створивши відповідні подання, користувачі можуть за допомогою цих уявлень вибирати з таблиці тільки ті рядки, які вони самі вставили.
Подання view_analyst в прикладі являє горизонтальне і вертикальне підмножина таблиці Employee. Іншими словами, воно обмежує доступ до певних рядках і стовпцях цієї таблиці.