powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пользователи имеющие привилегии на опр схему
20 сообщений из 20, страница 1 из 1
Пользователи имеющие привилегии на опр схему
    #32092618
MA_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваши предложения по определению всех пользователей, имеющие привилегии
хотя бы на одну таблицу схемы явно и через роли.
Сам сделал, но хотел бы посмотреть варианты
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092628
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
????
Естественно через роли. Пользователей много, они меняются, а роли конкретны. Дал кому-то две роли, отобрал три, ... На то и роли.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092632
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего это рекурсия, поскольку роль может быть дана другой роли:

По каждому пользователю:
1. Проверить для пользователя/роли, нет ли grant select any table.
2. Проверить, нет ли grant select on schema.table.
3. Для каждой роли, выданной текущему пользователю/роли перейти на п.1.

Если ответ надо дать в виде да/нет, но можно обойтись одной функцией.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092642
MA_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это все ясно как день, хотел бы скрипт увидеть
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092665
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так а что ту такого?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
create or replace function grantedSelect (
    p_grantee varchar2
  , p_owner varchar2
  , p_table_name varchar2
) return varchar2 as
  v_row varchar2( 64 );
  cursor cr_sys_privs is 
    select privilege 
    from dba_sys_privs 
    where  1 = 1 
      and grantee = p_grantee 
      and privilege = 'SELECT ANY TABLE';
  cursor cr_tab_privs is 
    select privilege 
    from dba_tab_privs 
    where  1 = 1 
      and grantee = p_grantee 
      and owner = p_owner
      and table_name = p_table_name
      and privilege = 'SELECT';       
begin
  open cr_sys_privs; fetch cr_sys_privs into v_row; close cr_sys_privs;
  if v_row is not null then return 'TRUE'; end if;
  open cr_tab_privs; fetch cr_tab_privs into v_row; close cr_tab_privs;
  if v_row is not null then return 'TRUE'; end if;
  for i in (
    select granted_role from dba_role_privs where grantee = p_grantee
  ) loop                 
    if grantedSelect(i.granted_role, p_owner, p_table_name) = 'TRUE' then
      return 'TRUE';
    end if;  
  end loop;
  return 'FALSE';
end;
/

 -- Проверка
 
select grantedSelect(user, 'SCOTT', 'EMP') from dual;

Дальше, я думаю, прозрачно: написать нечто подобное для _всех_ таблиц одного пользователя, и пройтись по всем пользователям в поисках привилегий.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092667
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
табл. роли - role_tab_privs
роль роли - dba_role_privs
...
Так и говори - а вот одним select-ом?
(а то может покажется, что обратную задачу надо решать)
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092710
MA_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечным результатом является список юзеров,
Зачем выбирать из sys_privs там только системные привилегии
и на все одним запросом
Например есть схема 1 , роль 1 на select ан все табл схемы 1

user 1 c ролью 1
user 2 с ролью 1
user 3 прямой grant на схему

Вопрос: кто имеет прив на табл схемы 1
Ответ :
user1
user2
user3
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092727
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov:
Не слишком ли сложно в твоём последнем примере?

Нет желания копать слишком глубоко, что приходит сразу на ум:

На примере: пользователи имеющие хотя-бы одну привелегию на любую таблицу схемы SYS.
предоставленные непосредственно пользователям:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select
 distinct
grantee
 from
 dba_tab_privs
where
 owner = 'SYS' and
 grantee in (select username from dba_users)


предоставленные ролям:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select
 distinct
 role
 from
  role_tab_privs
where
 owner = 'SYS'


Далее необходимо просто определить все роли, которые имеют вышеперечисленные роли. А потом по общему списку ролей определить какие пользователи имеют эти роли и сделать UNION с первым запросом.

Вобщем что-то типа этого.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092786
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откровенно говоря, трудно уже соображаю, но как быть со случаем наподобе:

grant select on table1 to role1;
grant role1 to role2;
grant role2 to role3;
...
grant roleN to user1;

тут имхо без рекурсии никуда.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092811
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... без рекурсии никуда ...

а что сделать красиво на деревьях

create table eee.role_privs as select * from dba_role_privs;
SELECT LEVEL, granted_role
FROM celt_.role_privs
START WITH grantee = 'DBA'
CONNECT BY PRIOR granted_role = grantee
order by LEVEL, grantee
а собственника (сама схема или объект схемы) из dba_tab_privs в корень дерева
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092813
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, какой-то сор прилепился ...
то есть
create table role_privs as select * from dba_role_privs;
SELECT LEVEL, granted_role
FROM celt_.role_privs
START WITH grantee in (select OWNER from dba_tab_privs where table_name='DEF$_LOB')
CONNECT BY PRIOR granted_role = grantee
order by LEVEL, grantee
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092815
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A zachem sortirovat - dereviasku razrushaesh.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092816
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A zachem sortirovat - dereviasku razrushaesh

так чтобы в поленья потом уложить, но хош так

SELECT distinct granted_role
FROM role_privs
START WITH grantee in (select OWNER from dba_tab_privs where table_name='DEF$_LOB')
CONNECT BY PRIOR granted_role = grantee
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32092834
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: выбрать всех юзеров, имеющих грант UPDATE на
таблицу DEF$_TEMP$LOB.

create table role_privs as select * from dba_role_privs;
select distinct owner from dba_tab_privs where
grantee in (SELECT distinct granted_role
FROM role_privs
START WITH grantee in (select distinct OWNER from dba_tab_privs
where table_name='DEF$_TEMP$LOB' and privilege='UPDATE')
CONNECT BY PRIOR granted_role = grantee)

Есть ли ещё проще и короче?
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32093448
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тысячу извинений за предыд. недоделанности (была пятница, конец дня ...)

Выдать все user-ов, имеющих хоть какие-то права на какие-то объекты, например в схеме SYSTEM

(
select username from dba_users
intersect
select grantee from dba_sys_privs where privilege
in ('SELECT ANY TABLE', 'EXECUTE ANY PROCEDURE', 'UPDATE ANY TABLE'
-- и прочее и лучше NOT IN
)
)
union
(
select username from dba_users
intersect
select grantee from dba_role_privs
where
granted_role in
(
SELECT distinct granted_role
FROM role_privs
START WITH grantee='SYSTEM'
CONNECT BY PRIOR granted_role = grantee
))
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32093489
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вспомни про 07_DICTIONARY_ACCESSIBILITY:) Вот из-за таких вот вещей, когда ответ на вопрос надо собирать из нескольких источников, мне и нравится больше процедурный подход, иначе один универсальный запрос может стать несколько сложноватым.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32093492
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Alexandr Plus: А как насчёт обьектных привилегий? У тебя только системные и для ролей. А каже обьектные привелегие выданные пользователям
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32093504
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(
select username from dba_users
intersect
select grantee from dba_sys_privs where privilege
in ('SELECT ANY TABLE', 'EXECUTE ANY PROCEDURE', 'UPDATE ANY TABLE'
-- и прочее и лучше NOT IN
)
)
union
(
select username from dba_users
intersect
select grantee from dba_role_privs
where
granted_role in
(
SELECT distinct granted_role
FROM role_privs
START WITH grantee='SYSTEM'
CONNECT BY PRIOR granted_role = grantee
))
union
(
select username from dba_users
intersect
select grantee from dba_tab_privs
where owner='SYSTEM'
)
union
(
select username from dba_users
intersect
... from dba_...

Вообще согласен - это не выход!
Но у MA_D в условии среди объктов только таблицы.
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32093526
MA_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да мне собственно нужны тока таблицы, спасибо за уделенной время
...
Рейтинг: 0 / 0
Пользователи имеющие привилегии на опр схему
    #32093538
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за уделенное время

Спасибо за тренировку.
Полагаю, что те, кто отвечает, что-то параллельно
в своём мудрят над ролями.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Пользователи имеющие привилегии на опр схему
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]