![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как программно получить информацию о ROLE [FB 1.0]
Term © (2004-04-14 17:28:00)Как программно получить информацию о ROLE
Term (2004-04-15 11:53:00) [1]спасибо
Val (2004-04-15 11:41:00) [2]12 Пользователи, права
Для того, что бы получить доступ к базе данных, нужно быть пользователем, прописанным на 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;
bds (2004-04-15 11:26:00) [3]Вот один из методов. В текст запроса пишешь:
Query.sql.add('SELECT RDB$USER,RDB$PRIVILEGE,RDB$RELATION_NAME '+
'FROM RDB$USER_PRIVILEGES WHERE UPPER(RDB$USER)=?AUser AND UPPER'+'(RDB$RELATION_NAME)=?ARelation');
AUser - имя пользователя или роли
ARelation - имя таблицы/View/Procedure
Ну а дальше "собираешь" права на обьект:
Rights:=[]; // множество прав на обьект
while not Query.eof do
begin
if Copy(Trim(FieldByName('RDB$PRIVILEGE').AsString),1,1)='S' then Rights:=Rights+[rtSelect];
if Copy(Trim(FieldByName('RDB$PRIVILEGE').AsString),1,1)='I' then Rights:=Rights+[rtInsert];
if Copy(Trim(FieldByName('RDB$PRIVILEGE').AsString),1,1)='U' then Rights:=Rights+[rtUpdate];
if Copy(Trim(FieldByName('RDB$PRIVILEGE').AsString),1,1)='D' then Rights:=Rights+[rtDelete];
if Copy(Trim(FieldByName('RDB$PRIVILEGE').AsString),1,1)='X' then Rights:=Rights+[rtExecute];
if Copy(Trim(FieldByName('RDB$PRIVILEGE').AsString),1,1)='R' then Rights:=Rights+[rtReference];
Next;
end;
Johnmen (2004-04-14 17:34:00) [4]Это кто такой/такая ?
:)
Кстати, есть системные таблицы...
Term (2004-04-14 17:34:00) [5]т.е. я имел ввиду, информацию о правах