Czy ktoś może mi powiedzieć, jak wyświetlić wszystkie uprawnienia / reguły określonego użytkownika w konsoli sql?
Czy ktoś może mi powiedzieć, jak wyświetlić wszystkie uprawnienia / reguły określonego użytkownika w konsoli sql?
Odpowiedzi:
Możesz wypróbować poniższe widoki.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
Administratorzy baz danych i inni użytkownicy zaawansowani mogą znaleźć uprawnienia nadane innym użytkownikom za pomocą DBA_
wersji tych samych widoków. Są ujęte w dokumentacji .
Te widoki pokazują tylko uprawnienia nadane bezpośrednio użytkownikowi. Znalezienie wszystkich uprawnień, w tym uprawnień nadanych pośrednio przez role, wymaga bardziej skomplikowanych rekurencyjnych instrukcji SQL:
select * from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER' order by 1,2,3;
select * from dba_sys_privs where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3;
select * from dba_tab_privs where grantee = '&USER' or grantee in (select granted_role from dba_role_privs connect by prior granted_role = grantee start with grantee = '&USER') order by 1,2,3,4;
Istnieją różne skrypty, które to robią w zależności od tego, jak szalony chcesz się stać. Osobiście użyłbym skryptu find_all_privs Pete'a Finnigana .
Jeśli chcesz napisać to sam, zapytanie jest dość trudne. Użytkownikom można nadawać uprawnienia systemowe, które są widoczne w DBA_SYS_PRIVS
. Można im nadać uprawnienia do obiektów, które są widoczne wDBA_TAB_PRIVS
. I można im przypisać role, które są widoczne w DBA_ROLE_PRIVS
(role mogą być domyślne lub inne i mogą również wymagać hasła, więc tylko dlatego, że użytkownikowi nadano rolę, nie oznacza, że użytkownik może koniecznie korzystać z uprawnień, które nabyte domyślnie przez rolę). Ale te role mogą z kolei być nadane uprawnienia systemowe, przywileje obiektu i dodatkowe role, które mogą być oglądane przez patrząc ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
i ROLE_ROLE_PRIVS
. Skrypt Pete'a przechodzi przez te relacje, aby pokazać wszystkie uprawnienia, które ostatecznie wpływają na użytkownika.
SYS
przywilejów i chcą tylko przyjrzeć się przywilejom własnego konta, scenariusz jest całkowicie bezwartościowy. Nie mam dostępu do UTL_FILE
Ani DBA_SYS_PRIVS
, a drugi DBA
i SYS
obszarach spojrzenia na skryptów.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
i ROLE_ROLE_PRIVS
musi zostać zbadane. Dokumenty wskazują, że są przeznaczone dla bieżącego użytkownika.
Kolejny przydatny zasób:
http://psoug.org/reference/roles.html
DBA
ani SYS
ról, a chcesz po prostu znaleźć uprawnienia swojego własnego konta.
Chociaż odpowiedź Raviteja Vutukuri działa i jest łatwa do złożenia, nie jest szczególnie elastyczna w zmienianiu filtrów i nie pomaga zbytnio, jeśli chcesz zrobić coś programowo. Więc ułożyłem własne zapytanie:
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
LISTAGG(GRANT_TARGET, ',') WITHIN GROUP (ORDER BY GRANT_TARGET) AS GRANT_SOURCES, -- Lists the sources of the permission
MAX(ADMIN_OR_GRANT_OPT) AS ADMIN_OR_GRANT_OPT, -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
MAX(HIERARCHY_OPT) AS HIERARCHY_OPT -- MAX acts as a Boolean OR by picking 'YES' over 'NO'
FROM (
-- Gets all roles a user has, even inherited ones
WITH ALL_ROLES_FOR_USER AS (
SELECT DISTINCT CONNECT_BY_ROOT GRANTEE AS GRANTED_USER, GRANTED_ROLE
FROM DBA_ROLE_PRIVS
CONNECT BY GRANTEE = PRIOR GRANTED_ROLE
)
SELECT
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME,
REPLACE(GRANT_TARGET, USERNAME, 'Direct to user') AS GRANT_TARGET,
ADMIN_OR_GRANT_OPT,
HIERARCHY_OPT
FROM (
-- System privileges granted directly to users
SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
FROM DBA_SYS_PRIVS
WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
UNION ALL
-- System privileges granted users through roles
SELECT PRIVILEGE, NULL AS OBJ_OWNER, NULL AS OBJ_NAME, ALL_ROLES_FOR_USER.GRANTED_USER AS USERNAME, GRANTEE AS GRANT_TARGET, ADMIN_OPTION AS ADMIN_OR_GRANT_OPT, NULL AS HIERARCHY_OPT
FROM DBA_SYS_PRIVS
JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_SYS_PRIVS.GRANTEE
UNION ALL
-- Object privileges granted directly to users
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, GRANTEE AS GRANT_TARGET, GRANTABLE, HIERARCHY
FROM DBA_TAB_PRIVS
WHERE GRANTEE IN (SELECT USERNAME FROM DBA_USERS)
UNION ALL
-- Object privileges granted users through roles
SELECT PRIVILEGE, OWNER AS OBJ_OWNER, TABLE_NAME AS OBJ_NAME, GRANTEE AS USERNAME, ALL_ROLES_FOR_USER.GRANTED_ROLE AS GRANT_TARGET, GRANTABLE, HIERARCHY
FROM DBA_TAB_PRIVS
JOIN ALL_ROLES_FOR_USER ON ALL_ROLES_FOR_USER.GRANTED_ROLE = DBA_TAB_PRIVS.GRANTEE
) ALL_USER_PRIVS
-- Adjust your filter here
WHERE USERNAME = 'USER_NAME'
) DISTINCT_USER_PRIVS
GROUP BY
PRIVILEGE,
OBJ_OWNER,
OBJ_NAME,
USERNAME
;
Zalety:
WHERE
klauzulę.DBMS_OUTPUT
czegoś (w porównaniu do połączonego skryptu Pete'a Finnigana). Dzięki temu jest przydatny do użycia programistycznego i do eksportowania.GRANT
.USER_SYS_PRIVS
(uprawnienia nadane bezpośrednio do systemu), USER_TAB_PRIVS
(uprawnienia nadane bezpośrednio do obiektu) USER_ROLE_PRIVS
(role bezpośrednio nadane użytkownikowi), ROLE_ROLE_PRIVS
( uprawnienia do dziedziczenia ról), ROLE_SYS_PRIVS
(uprawnienia systemowe przez role) i ROLE_TAB_PRIVS
(uprawnienia do obiektów przez role). Fuj. Oracle jest tak skomplikowana.
Możesz użyć poniższego kodu, aby uzyskać listę wszystkich uprawnień od wszystkich użytkowników.
select * from dba_sys_privs
Aby wyświetlić wszystkie uprawnienia:
wybierz nazwę z system_privilege_map;