#oracle
#Oracle
Вопрос:
Мне нужно предоставить пользователю доступ к некоторым таблицам в схеме базы данных Oracle, я уже создал этого пользователя раньше, но в базе данных много таблиц (более 1000 таблиц), поэтому мне нужен SQL-запрос, чтобы показать все таблицы, к которым пользователь может подключиться. Этот пользователь может использовать только SELECT.
Пожалуйста, помогите мне решить эту проблему!
Ответ №1:
Вы можете использовать приведенный ниже запрос. Он покажет все таблицы, к которым имеет доступ текущий пользователь сеанса,
select * from user_tables;
Для просмотра всех таблиц,
select * from all_tables;
Перечислите всех пользователей, которым была назначена определенная роль
-- Change 'DBA' to the required role
select * from dba_role_privs where granted_role = 'DBA'
Перечислите все роли, предоставленные пользователю
-- Change 'PHIL@ to the required user
select * from dba_role_privs where grantee = 'PHIL';
Перечислите все привилегии, предоставленные пользователю
select
lpad(' ', 2*level) || granted_role "User, his roles and privileges"
from
(
/* THE USERS */
select
null grantee,
username granted_role
from
dba_users
where
username like upper('%amp;enter_username%')
/* THE ROLES TO ROLES RELATIONS */
union
select
grantee,
granted_role
from
dba_role_privs
/* THE ROLES TO PRIVILEGE RELATIONS */
union
select
grantee,
privilege
from
dba_sys_privs
)
start with grantee is null
connect by grantee = prior granted_role;
Примечание: взято из http://www.adp-gmbh.ch/ora/misc/recursively_list_privilege.html
Перечислите, к каким таблицам определенная роль предоставляет доступ к выбору?
-- Change 'DBA' to the required role.
select * from role_tab_privs where role='DBA' and privilege = 'SELECT';
Перечислите все таблицы, из которых пользователь может ВЫБИРАТЬ?
--Change 'PHIL' to the required user
select * from dba_tab_privs where GRANTEE ='PHIL' and privilege = 'SELECT';
Перечислите всех пользователей, которые могут ВЫБИРАТЬ в определенной таблице (либо через предоставление соответствующей роли, либо через прямое предоставление (т.Е. Предоставить выбор на доступном для джо))? Результат этого запроса также должен показать, через какую роль пользователь имеет этот доступ или это был прямой грант.
-- Change 'TABLENAME' below
select Grantee,'Granted Through Role' as Grant_Type, role, table_name
from role_tab_privs rtp, dba_role_privs drp
where rtp.role = drp.granted_role
and table_name = 'TABLENAME'
union
select Grantee,'Direct Grant' as Grant_type, null as role, table_name
from dba_tab_privs
where table_name = 'TABLENAME' ;
Комментарии:
1. Привет, Нишанти Грашиа, с помощью этой команды выше я не могу найти столбец «Имя пользователя» для фильтрации с моим указанным пользователем. Нужно ли мне вводить дополнительные параметры?
2. Да, привет, надеюсь, мой ответ поможет вам!
3. @JackVo: О каком запросе вы говорите? Какое имя пользователя вы хотите?
4. Привет, Нишанти Грашиа, я хочу указать только имя пользователя, которое было создано администратором, а не пользователем по умолчанию.
Ответ №2:
Посмотрите на http://docs.oracle.com/cd/B10501_01/server.920/a96521/privs.htm#15665
Проверьте таблицы USER_SYS_PRIVS, USER_TAB_PRIVS, USER_ROLE_PRIVS.
Также полезно использовать это:-
select * from USER_ROLE_PRIVS where USERNAME='SAMPLE';
select * from USER_TAB_PRIVS where Grantee = 'SAMPLE';
select * from USER_SYS_PRIVS where USERNAME = 'SAMPLE';
Поместите «user» вместо sample, чтобы получить информацию о текущем зарегистрированном пользователе. Надеюсь, это поможет!