Заметки о системных таблицах InterBase


Пользователи, права.


Для того, что бы получить доступ к базе данных, нужно быть пользователем, прописанным на InterBase-сервере, и иметь пароль. Но этого не достаточно, чтобы оперировать с объектами базы данных. Пользователь должен иметь права на выполнение той или иной операции.

Посмотреть, какие пользователи известны серверу можно, используя базу данных Isc4.gdb.

select USER_NAME, FIRST_NAME, MIDDLE_NAME, LAST_NAME from USERS order by USER_NAME;

Этот запрос даст список имен пользователей, а также их имена и фамилии. Помимо пользователей обычных можно определять роли, давать им права, а потом пользователям назначать роли.

Посмотрим, какие роли есть в базе данных. select * from RDB$ROLES;

Поле RDB$ROLE_NAME - содержит имя роли, а поле RDB$OWNER_NAME - содержит имя пользователя, создавшего роль.

Посмотрим теперь, что можно узнать про права того или иного пользователя, по отношению к объектам базы данных. Информацию об этом можно найти в таблице RDB$USER_PRIVILEGES.

select RDB$GRANTOR, RDB$PRIVILEGE, RDB$GRANT_OPTION, RDB$RELATION_NAME from RDB$USER_PRIVILEGES where RDB$USER="SVETA";

Приведенный выше SQL-запрос показывает все права пользователя SVETA. Поле RDB$GRANTOR - содержит имя пользователя, предоставившего это право. RDB$PRIVILEGE - описывает привилегию (расшифровка значений приведена в документации). RDB$GRANT_OPTION определяет, может ли пользователь, получивший эту привилегию, передать ее другому пользователю. Если значение равно единице, то такая возможность есть. RDB$RELATION_NAME - наименование объекта базы данных, для которого привилегия допустима. А как узнать привилегии, назначенные ролям?

select a.RDB$USER, a.RDB$GRANTOR, a.RDB$PRIVILEGE, a.RDB$GRANT_OPTION, a.RDB$RELATION_NAME from RDB$USER_PRIVILEGES a, RDB$ROLES b where a.RDB$USER = b.RDB$ROLE_NAME;

Этот запрос почти идентичен предыдущему по выдаваемым результатам, кроме поля a.RDB$USER. Оно содержит, в данном случае, наименование роли.

Изменив немного предыдущий запрос, можно узнать, права каких ролей кому предоставлены.

select a.RDB$USER, a.RDB$GRANTOR, a.RDB$PRIVILEGE, a.RDB$GRANT_OPTION, a.RDB$RELATION_NAME from RDB$USER_PRIVILEGES a, RDB$ROLES b where a.RDB$RELATION_NAME = b.RDB$ROLE_NAME;



Содержание раздела