3. Ddl: операції управління правами доступу
3.1. Безпека і санкціонування доступу
У контексті баз даних термін безпека означає захист даних від несанкціонованого розкриття, зміни чи знищення. SQL дозволяє індивідуально захищати як цілі таблиці, так і окремі їхні поля. Для цього є дві більш-менш незалежні можливості:
механізм представлень, використовуваний для приховання засекречених даних від користувачів, що не володіють правом доступу;
підсистема санкціонування доступу, що дозволяє надати зазначеним користувачам визначені привілеї на доступ до даних і дати їм можливість вибірково і динамічно передавати частину виділених привілеїв іншим користувачам, скасовуючи згодом ці привілеї, якщо буде потрібно.
Звичайно при установці СУБД у неї вводиться якийсь ідентифікатор, що повинен далі розглядатися як ідентифікатор найбільш привілейованого користувача - системного адміністратора. Кожний, хто може ввійти в систему з цим ідентифікатором (і може витримати тести на вірогідність), буде вважатися системним адміністратором до виходу із системи. Системний адміністратор може створювати бази даних і має всі привілеї на їхнє використання. Ці чи привілеї їхня частина можуть надаватися іншим користувачам (користувачам з іншими ідентифікаторами). У свою чергу, користувачі, що одержали привілеї від системного адміністратора, можуть передати їх (чи їх частину) іншим користувачам, що можуть їх передати наступним і т.д.
Привілеї надаються за допомогою речення GRANT (надати), загальний формат якого має вигляд
GRANT привілеї ON об'єкт TO користувачі;
У ньому "привілеї" - список, що складається з однієї чи кількох привілеїв, розділених комами, або фраза ALL PRIVILEGES (усі привілеї); "об'єкт" - ім'я і, якщо треба, тип об'єкта (база даних, таблиця, представлення, індекс і т.п.); "користувачі" - список, що включає один чи більш ідентифікаторів санкціонування, розділених комами, або спеціальне ключове слово PUBLIC (загальнодоступний).
До таблиць (представлень) відносяться привілеї SELECT, DELETE, INSERT і UPDATE [(стовпці)], що дозволяють відповідно зчитувати (виконувати будь-які операції, у яких використовується SELECT), видаляти, додавати чи змінювати рядки зазначеної таблиці (зміна можна обмежити конкретними стовпцями). Наприклад, речення
GRANT SELECT, UPDATE (Праця) ON Блюда TO cook;
дозволяє користувачу, що представився системі ідентифікатором cook, використовувати інформацію з таблиці Блюда, але змінювати в ній він може тільки значення стовпця Праця.
Якщо користувач USER_1 надав які-небудь привілеї іншому користувачу USER_2, то він може згодом скасувати всі чи деякі з цих привілеїв. Скасування здійснюється за допомогою речення REVOKE (скасувати), загальний формат якого дуже схожий на формат речення GRANT:
REVOKE привілею ON об'єкт FROM користувачі;
Наприклад, можна відібрати в користувача cook право зміни значень стовпця Праця:
REVOKE UPDATE (Праця) ON Блюда FROM cook;
3.2. Команди управління правами доступу
З міркувань безпеки не кожному користувачу прикладної системи може бути дозволено одержувати інформацію з якої-небудь таблиці, а тим більше змінювати в ній дані. Для визначення прав користувачів щодо об'єктів бази даних (таблиці, представлення, індекси) у SQL визначена пара команд GRANT і REVOKE. Синтаксис операції передачі прав на таблицю:
GRANT <тип_права_на_таблицю>
ON <ім'я_таблиці> [<список_стовпців>]
TO <ім'я_користувача>
Права користувача на рівні таблиці визначаються наступними ключовими словами (як ми побачимо трохи пізніше ці ключові слова збігаються з командами вибірки і зміни даних):
SELECT - одержання інформації з таблиці
UPDATE - зміна інформації в таблиці
INSERT - додавання записів у таблицю
DELETE - видалення записів з таблиці
INDEX - індексування таблиці
ALTER - зміна схеми визначення таблиці
ALL - усі права
У поле <тип_права_на_таблицю> може бути зазначене або ключове слово ALL чи будь-яка комбінація інших ключових слів. Наприклад, надамо усі права на таблицю publishersкористувачу andy:
GRANT ALL ON publishers TO andy;
Користувачу peter надамо права на витяг і додавання записів на цю же таблицю:
GRANT SELECT INSERT ON publishers TO peter;
У тому випадку, коли однакові права треба надати відразу всім користувачам, замість виконання команди GRANT для кожного з них, можна замість імені користувача вказати ключове слово PUBLIC:
GRANT SELECT ON publishers TO PUBLIC;
Скасування прав здійснюється командою REVOKE:
REVOKE <тип_права_на_таблицю>
ON <ім'я_таблиці> [<список_стовпців>]
FROM <ім'я_користувача>;
Усі ключові слова даної команди еквівалентні оператору GRANT.
Більшість систем підтримують також команду GRANT для призначення привілеїв на базу даних у цілому. У цьому випадку формат команди:
GRANT <тип_права_на_базу_даних>
ON <ім'я_бази даних>
TO <ім'я_користувача>;
На жаль, способи завдання прав на базу даних різні для різних СУБД, і точне їхнє формулювання потрібно уточнювати в документації. Як приклад приведемо список прав на базу даних, підтримуваних СУБД Informix:
CONNECT - права на доступ до даних і їхньому модифікацію, якщо це дозволено на рівні таблиці;
RESOURCE - права на управління ресурсами. Усе перераховане вище плюс права на створення нових об'єктів (таблиць, індексів і т.д.) і видалення і зміна тих об'єктів, який даний користувач володіє;
DBA - права на адміністрування. Усі права на управління ресурсами плюс права на видалення бази даних, видалення будь-яких об'єктів, призначення і скасування прав інших користувачів.
Скасування прав на базу даних здійснюються командою:
REVOKE <тип_права_на_базу_даних> FROM <ім'я_користувача>;
[1] Системний каталог - це набір таблиць, у яких міститься інформація, необхідна для правильного функціонування СУБД: про підтримувані бази даних і їхніх базових таблиць, представленнях, курсорах, індексах, користувачах і їхніх правах доступу до інформації, правилах модифікації даних і т.д. У різних СУБД, що підтримують SQL, існує від десятка до кількох десятків системних таблиць, структура яких нічим не відрізняється від структури користувальницьких таблиць.
