logo search
Книга по БД(Вальке А

5.9.3. Права на таблицы

Если пользователь имеет права на базу данных, это не означает автоматически, что он имеет возможность получать любую информацию из любой таблицы. Наличие права на уровне базы данных означает возможность подключиться к базе данных, то есть выполнить оператор DATABASE. Все дальнейшие действия с содержимым базы данных производятся в соответствии с правами на уровне объектов (таблиц и процедур).

Каждая таблица в базе данных имеет своего владельца. Когда, например, какой-либо пользователь создает таблицу, он автоматически становится владельцем этой таблицы. Владелец может поменять таблицу, удалить ее, дать другому пользователю права на использование этой талицы.

Права на уровне таблиц бывают следующего типа:

Синтаксис оператора передачи права на таблицу выглядит следующим образом:

GRANT <тип права на таблицу> ON <имя таблицы> TO <имя пользователя>

Вместо имени пользователя можно использовать слово PUBLIC, означающее всех пользоователей. Например:

GRANT ALL ON persons TO micky GRANT SELECT ON persons TO roma GRANT INSERT ON items TO PUBLIC

В тех случаях, когда при передаче права на таблицу можно специфицировать конкретные поля (права UPDATE, SELECT и REFERENCES), то имена полей надо указать в скобках после названия права:

GRANT <тип права на таблицу> (<имя поля>, <имя поля>, ....) ON <имя таблицы> TO <имя пользователя>

Например:

GRANT SELECT(person_id, lname, fname) ON persons TO PUBLIC

Если какой-либо пользователь не имеет права на выборку того или иного поля, то он не может его использовать не только в разделе SELECT, но и в разделе WHERE. Например, если пользователь nick не имеет права на выборку поля address из таблицы persons, то он не имеет права выполнить следующие два запроса:

SELECT lname, fname, address FROM persons WHERE person_id = 101 SELECT lname, fname FROM persons WHERE address MATCHES "*Одесса*"

Пользователь, получивший то или иное право с помощью оператора GRANT ... ON ... TO ... не может передать это право другому пользователю. Для возможности передачи права другим, пользователь должен получить право на его передачу. Это право указывается в операторе GRANT с помощью ключевых слов WITH GRANT OPTION:

GRANT <тип права на таблицу> (<имя поля>, ....) ON <имя таблицы> TO <имя пользователя> WITH GRANT OPTION

Например, владелец таблицы tabl может передать право на выборку для пользователей "sales" и "tech", но пользователю "tech" это право передается с правом передачи:

GRANT SELECT ON tabl TO sales GRANT SELECT ON tabl TO tech WITH GRANT OPTION

После этого пользователь "tech" может выполнить следующие два оператора, а пользователь "sales" не может:

GRANT SELECT ON tabl TO jason WITH GRANT OPTION GRANT SELECT ON tabl TO micky

Права на таблицу могут как передаваться, так и отбираться. Отобрать право у пользователя можно только в том случае, если Вы передали ему это право, либо Вы являетесь владельцем таблицы.

Если Вы отбираете право у пользователя , который получил его с правом на передачу, то автоматически этого права лишаются и те, кому пользователь это право передал. Отбирание права производится оператором

REVOKE <тип права на таблицу> ON <имя таблицы> FROM <имя пользователя>

Например:

REVOKE UPDATE ON persons FROM george REVOKE ALL ON passwords FROM PUBLIC

Если какое-либо право отбирается у пользователя, которому оно было дано с правом на передачу (WITH GRANT OPTION), то это право теряют и те пользователи, кому этот пользователь его передал. Предположим, Вы владелец таблицы tab1. Вы передаете право на вставку пользователям user1, user2:

GRANT INSERT ON tab1 TO user1 WITH GRANT OPTION GRANT INSERT ON tab1 TO user2 WITH GRANT OPTION

Затем, пользователь "user1" передал это право пользователю "user3":

GRANT INSERT ON tab1 TO user3

Теперь, если Вы отберете право на выборку у пользователя "user1", то его автоматически потеряет и пользователь "user3".

В операторах GRANT и REVOKE для таблиц и процедур можно использовать несколько прав одновременно и указывать несколько пользователей одновременно. Название прав и имена пользователей в этом случае надо указывать через запятую. Например оператор

GRANT SELECT, UPDATE(fname, lname, address) ON persons TO micky, roma

Эквивалентен следующим четырем операторам:

GRANT UPDATE(fname, lname, address) ON persons TO micky GRANT SELECT ON persons TO micky GRANT UPDATE(fname, lname, address) ON persons TO roma GRANT SELECT ON persons TO roma