Как показать список пользователей, у которых есть разрешение «ВЫБРАТЬ» для определенной таблицы?

#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, чтобы получить информацию о текущем зарегистрированном пользователе. Надеюсь, это поможет!