Jak wyświetlić wszystkie uprawnienia użytkownika w Oracle?


Odpowiedzi:


164

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;

21

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_PRIVSi ROLE_ROLE_PRIVS. Skrypt Pete'a przechodzi przez te relacje, aby pokazać wszystkie uprawnienia, które ostatecznie wpływają na użytkownika.


Skrypt jest niesamowity, właśnie go sprawdziłem
I.Tyger

1
Potrzebujesz uprawnień do pakietu UTL_FILE, inaczej pojawi się błąd podczas uruchamiania skryptu Pete'a Finnigana: „identyfikator 'UTL_FILE' musi być zadeklarowany”. Możesz połączyć się jako sys z roll sysdba przez SQL Developer, a wtedy będzie działać lub nadać sobie uprawnienia do wykonywania tego pakietu za pomocą: grant execute on UTL_FILE to <user>;
Sty

1
A dla tych z nas, którzy nie mają SYSprzywilejów i chcą tylko przyjrzeć się przywilejom własnego konta, scenariusz jest całkowicie bezwartościowy. Nie mam dostępu do UTL_FILEAni DBA_SYS_PRIVS, a drugi DBAi SYSobszarach spojrzenia na skryptów.
vapcguy

Nie sądzę ROLE_SYS_PRIVS, ROLE_TAB_PRIVSi ROLE_ROLE_PRIVSmusi zostać zbadane. Dokumenty wskazują, że są przeznaczone dla bieżącego użytkownika.
jpmc26

Jeśli ktoś ma kopię tych skryptów, czy może opublikować tutaj lub w innym miejscu bardziej wiecznie zielonym, jak streszczenie? Witryna nie działa.
Michael Thompson


2

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:

  • Z łatwością mogę filtrować według wielu różnych informacji, takich jak obiekt, przywilej, czy jest to związane z określoną rolą itp. Po prostu zmieniając tę WHERE klauzulę.
  • To jedno zapytanie, co oznacza, że ​​nie muszę w myślach komponować razem wyników.
  • Rozwiązuje kwestię tego, czy mogą nadać przywilej, czy nie, i czy obejmuje on uprawnienia dla podobiektów (część „hierarchiczna”) między różnymi źródłami uprawnień.
  • Łatwo jest zobaczyć wszystko, co muszę zrobić, aby cofnąć przywilej, ponieważ zawiera listę wszystkich źródeł uprawnienia.
  • Łączy uprawnienia tabeli i systemu w jeden spójny widok, umożliwiając nam wyświetlenie wszystkich uprawnień użytkownika za jednym zamachem.
  • To zapytanie , a nie funkcja, która wyrzuca to wszystko do DBMS_OUTPUTczegoś (w porównaniu do połączonego skryptu Pete'a Finnigana). Dzięki temu jest przydatny do użycia programistycznego i do eksportowania.
  • Filtr nie jest powtarzany; pojawia się tylko raz. Ułatwia to zmianę.
  • Podzapytanie można łatwo wyciągnąć, jeśli trzeba je przeanalizować indywidualnie GRANT.

Kilka zadań do wykonania dla mnie: 1. Dodaj wskaźnik, czy użytkownik może nadać uprawnienie poprzez nadanie roli innemu użytkownikowi. 2. Dowiedz się, jak to zrobić dla bieżącego użytkownika bez uprawnień DBA. Prawdopodobnie obejmuje 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.
jpmc26

1

Możesz użyć poniższego kodu, aby uzyskać listę wszystkich uprawnień od wszystkich użytkowników.

select * from dba_sys_privs 

To nie zawiera wszystkich uprawnień. Jak wykazało kilka innych odpowiedzi, które poprzedziły twoją o lata , pomija ona uprawnienia tabeli i wszystkie uprawnienia nadane przez role.
jpmc26

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.