Пользователи
Получать информацию из базы данных могут далеко не все, а только зарегистрированные пользователи, обладающие определенными правами на объекты базы данных. В последних версиях InterBase список пользователей храниться в базе данных admin.ib (в более ранних версиях в Isc4.gdb).
Вот так можно получить перечень пользователей базы данных.
SELECT USER_NAME, FIRST_NAME, MIDDLE_NAME, LAST_NAME FROM USERS ORDER BY USER_NAME;
Из таблицы rdb$roles можно получить перечень ролей.
SELECT * from rdb$roles;
Привилегии могут выдаваться пользователям, ролям и другим объектам базы данных. Приведенный ниже запрос возвращает информацию о том, кому (RDB$USER_PRIVILEGES.RDB$USER), кто (RDB$USER_PRIVILEGES.RDB$GRANTOR), какую привилегию (RDB$USER_PRIVILEGES.RDB$PRIVILEGE) и на какой объект (RDB$USER_PRIVILEGES.RDB$RELATION_NAME) выдал. Также возвращается информация о том, может ли получивший привилегию объект передать ее другому (RDB$USER_PRIVILEGES.RDB$GRANT_OPTION), а также указывается, на весь объект была дана привилегия или на его часть (RDB$USER_PRIVILEGES.RDB$FIELD_NAME).
SELECT RDB$USER_PRIVILEGES.RDB$USER, RDB$USER_PRIVILEGES.RDB$GRANTOR, RDB$USER_PRIVILEGES.RDB$PRIVILEGE, RDB$USER_PRIVILEGES.RDB$GRANT_OPTION, RDB$USER_PRIVILEGES.RDB$RELATION_NAME, RDB$USER_PRIVILEGES.RDB$FIELD_NAME, RDB$TYPES.RDB$TYPE_NAME, RDB$TYPES1.RDB$TYPE_NAME FROM RDB$USER_PRIVILEGES INNER JOIN RDB$TYPES ON (RDB$USER_PRIVILEGES.RDB$USER_TYPE = RDB$TYPES.RDB$TYPE) INNER JOIN RDB$TYPES RDB$TYPES1 ON (RDB$USER_PRIVILEGES.RDB$OBJECT_TYPE = RDB$TYPES1.RDB$TYPE) WHERE ((RDB$TYPES.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE') and (RDB$TYPES1.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE')) ORDER BY RDB$USER_PRIVILEGES.RDB$USER;
Аналогичный запрос, но возвращает информацию только для ролей (какие привилегии выданы ролям).
SELECT RDB$USER_PRIVILEGES.RDB$USER, RDB$USER_PRIVILEGES.RDB$GRANTOR, RDB$USER_PRIVILEGES.RDB$PRIVILEGE, RDB$USER_PRIVILEGES.RDB$GRANT_OPTION, RDB$USER_PRIVILEGES.RDB$RELATION_NAME, RDB$USER_PRIVILEGES.RDB$FIELD_NAME, RDB$TYPES.RDB$TYPE_NAME, RDB$TYPES1.RDB$TYPE_NAME FROM RDB$USER_PRIVILEGES INNER JOIN RDB$TYPES ON (RDB$USER_PRIVILEGES.RDB$USER_TYPE = RDB$TYPES.RDB$TYPE) INNER JOIN RDB$TYPES RDB$TYPES1 ON (RDB$USER_PRIVILEGES.RDB$OBJECT_TYPE = RDB$TYPES1.RDB$TYPE) INNER JOIN RDB$ROLES ON (RDB$USER_PRIVILEGES.RDB$USER = RDB$ROLES.RDB$ROLE_NAME) WHERE ( (RDB$TYPES.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE') and (RDB$TYPES1.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE') and (RDB$ROLES.RDB$ROLE_NAME = RDB$USER_PRIVILEGES.RDB$USER) ) ORDER BY RDB$USER_PRIVILEGES.RDB$USER;
Вот так можно посмотреть, какие привилегии даны триггерам.
SELECT RDB$USER_PRIVILEGES.RDB$USER, RDB$USER_PRIVILEGES.RDB$GRANTOR, RDB$USER_PRIVILEGES.RDB$PRIVILEGE, RDB$USER_PRIVILEGES.RDB$GRANT_OPTION, RDB$USER_PRIVILEGES.RDB$RELATION_NAME, RDB$USER_PRIVILEGES.RDB$FIELD_NAME, RDB$TYPES.RDB$TYPE_NAME, RDB$TYPES1.RDB$TYPE_NAME FROM RDB$USER_PRIVILEGES INNER JOIN RDB$TYPES ON (RDB$USER_PRIVILEGES.RDB$USER_TYPE = RDB$TYPES.RDB$TYPE) INNER JOIN RDB$TYPES RDB$TYPES1 ON (RDB$USER_PRIVILEGES.RDB$OBJECT_TYPE = RDB$TYPES1.RDB$TYPE) WHERE ((RDB$TYPES.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE') and (RDB$TYPES1.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE') and (RDB$TYPES.RDB$TYPE_NAME = 'TRIGGER')) ORDER BY RDB$USER_PRIVILEGES.RDB$USER;
Следующий запрос показывает, привилегии каких ролей каким пользователям выданы.
SELECT RDB$USER_PRIVILEGES.RDB$USER, RDB$USER_PRIVILEGES.RDB$GRANTOR, RDB$USER_PRIVILEGES.RDB$PRIVILEGE, RDB$USER_PRIVILEGES.RDB$GRANT_OPTION, RDB$USER_PRIVILEGES.RDB$RELATION_NAME, RDB$USER_PRIVILEGES.RDB$FIELD_NAME, RDB$TYPES.RDB$TYPE_NAME, RDB$TYPES1.RDB$TYPE_NAME FROM RDB$USER_PRIVILEGES INNER JOIN RDB$TYPES ON (RDB$USER_PRIVILEGES.RDB$USER_TYPE = RDB$TYPES.RDB$TYPE) INNER JOIN RDB$TYPES RDB$TYPES1 ON (RDB$USER_PRIVILEGES.RDB$OBJECT_TYPE = RDB$TYPES1.RDB$TYPE) INNER JOIN RDB$ROLES ON (RDB$USER_PRIVILEGES.RDB$RELATION_NAME = RDB$ROLES.RDB$ROLE_NAME) WHERE ((RDB$TYPES.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE') and (RDB$TYPES1.RDB$FIELD_NAME = 'RDB$OBJECT_TYPE')) ORDER BY RDB$USER_PRIVILEGES.RDB$USER;