Лишение привилегий
Как ANSI определяет команду CREATE TABLE для создания таблиц, но не предусматривает команды DROP TABLE для отказа от них, так же стандарт поддерживает команду GRANT для передачи привилегии пользователям, но не предусматривает способа лишить пользователя привилегий. Потребность лишения привилегий удовлетворяется с помощью команды REVOKE, которая де-факто стала одной из характеристик стандарта.
Синтаксис команды REVOKE повторяет синтаксис команды GRANT, но имеет противоположное значение. Таким образом, лишить Adrian привилегии выполнять команду INSERT для таблицы Orders можно с помощью команды:
REVOKE INSERT ON Orders FROM Adrian;
Списки привилегий и пользователей доступны, как и для команды GRANT, значит можно ввести следующую команду:
REVOKE INSERT, DELETE ON Customers FROM Adrian, Stephen;
Но кто имеет право лишать пользователей привилегий? Когда пользователь, имевший привилегии, лишается их, лишаются ли привилегий пользователи, получившие привилегии от него? Поскольку эта характеристика не является стандартной, однозначных ответов не существует. Наиболее распространенным подходом является следующий: привилегии отменяются пользователем, передавшим их, и отмена привилегий осуществляется каскадно, т.е. операция применяется последовательно ко всем пользователям, получившим привилегии от того пользователя, который их лишается в данный момент.
|
|
С привилегиями можно работать проще, используя представления. При передаче привилегии для базовой таблицы пользователю, она автоматически применяется ко всем строкам и, с возможными исключениями для UPDATE и REFERENCES, ко всем столбцам таблицы. Создавая представление, которое ссылается на базовую таблицу, и передавая привилегии представлению, а не базовой таблице, можно ограничить их любым выражением, применимым в запросе, который формирует представление. Это во многом определяет основные возможности команды GRANT.
Кто может создавать представления? Для того, чтобы создать представление, нужно иметь привилегию использования команды SELECT для всех таблиц, на которые есть ссылка в представлении. Если представление является обновляемым, любые привилегии INSERT, UPDATE и DELETE на таблицу, лежащую в основе представления, автоматически применимы также и к представлению. Если нет привилегий обновления таблиц, лежащих в основе представления, то их нет и для создаваемых конкретных представлений, даже если сами представления являются обновляемыми. Поскольку внешние ключи в представлениях не применяются, нет необходимости использовать привилегию REFERENCES при создании представлений. Эти ограничения определены ANSI. Можно использовать также нестандартные привилегии (будут рассмотрены далее в этой главе). В следующих разделах предположим, что создатели рассматриваемых представлений являются владельцами или имеют соответствующие привилегии на все используемые базовые таблицы.