Wie zeige ich alle Berechtigungen eines Benutzers in Oracle?

113

Kann mir bitte jemand sagen, wie alle Berechtigungen / Regeln eines bestimmten Benutzers in der SQL-Konsole angezeigt werden sollen?

Schicksal
quelle

Antworten:

164

Sie können diese Ansichten unten ausprobieren.

SELECT * FROM USER_SYS_PRIVS; 
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

Datenbankadministratoren und andere Hauptbenutzer können die Berechtigungen finden, die anderen Benutzern mit den DBA_Versionen derselben Ansichten gewährt wurden . Sie werden in der Dokumentation behandelt .

Diese Ansichten zeigen nur die Berechtigungen an, die dem Benutzer direkt gewährt wurden . Das Finden aller Berechtigungen, einschließlich der Berechtigungen, die indirekt über Rollen gewährt werden, erfordert kompliziertere rekursive SQL-Anweisungen:

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;
Teja
quelle
21

Es gibt verschiedene Skripte, die das tun, je nachdem, wie verrückt Sie werden möchten. Ich würde persönlich das Skript find_all_privs von Pete Finnigan verwenden .

Wenn Sie es selbst schreiben möchten, wird die Abfrage ziemlich schwierig. Benutzern können Systemberechtigungen gewährt werden, die in sichtbar sind DBA_SYS_PRIVS. Ihnen können Objektberechtigungen gewährt werden, die in sichtbar sind DBA_TAB_PRIVS. Und ihnen können Rollen zugewiesen werden, die in sichtbar sind DBA_ROLE_PRIVS(Rollen können standardmäßig oder nicht standardmäßig sein und auch ein Kennwort erfordern. Nur weil einem Benutzer eine Rolle gewährt wurde, bedeutet dies nicht, dass der Benutzer die von ihm verwendeten Berechtigungen unbedingt verwenden kann standardmäßig über die Rolle erworben). Aber diese Rollen können, die wiederum gewährt Systemprivilegien, Objektprivilegien und zusätzliche Rollen , die durch einen Blick auf eingesehen werden können ROLE_SYS_PRIVS, ROLE_TAB_PRIVSund ROLE_ROLE_PRIVS. Petes Skript geht diese Beziehungen durch, um alle Berechtigungen anzuzeigen, die einem Benutzer letztendlich zufließen.

Justin Cave
quelle
Das Skript ist fantastisch, habe es gerade
ausgecheckt
1
Sie benötigen Berechtigungen für das UTL_FILE-Paket. Andernfalls wird beim Ausführen des Pete Finnigan-Skripts eine Fehlermeldung angezeigt: "Der Bezeichner 'UTL_FILE' muss deklariert werden". Sie können über SQL Developer eine Verbindung als sys mit roll sysdba herstellen. Anschließend funktioniert es oder Sie erhalten Ausführungsberechtigungen für dieses Paket, indem Sie Folgendes ausführen: <user> für UTL_FILE ausführen;
Jan
1
Und für diejenigen von uns, die keine SYSPrivilegien haben und nur die Privilegien unseres eigenen Kontos betrachten möchten, ist das Skript absolut wertlos. Ich habe weder Zugriff auf UTL_FILEnoch auf DBA_SYS_PRIVSdie anderen DBAund SYSBereiche, auf die sich das Skript bezieht.
Vapcguy
Ich glaube nicht ROLE_SYS_PRIVS, ROLE_TAB_PRIVSund ROLE_ROLE_PRIVSBedürfnisse untersucht werden. Die Dokumente geben an, dass sie für den aktuellen Benutzer bestimmt sind.
jpmc26
Wenn jemand eine Kopie dieser Skripte hat, kann er sie hier oder an einem etwas immergrüneren Ort veröffentlichen? Die Seite ist ausgefallen.
Michael Thompson
7

Eine weitere nützliche Ressource:

http://psoug.org/reference/roles.html

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
Ageu
quelle
2
Außer wenn Sie keine DBAoder keine SYSRollen haben und nur die Berechtigungen Ihres eigenen Kontos suchen möchten.
Vapcguy
2

Während die Antwort von Raviteja Vutukuri funktioniert und schnell zusammengestellt werden kann, ist sie nicht besonders flexibel für die Variation der Filter und hilft nicht allzu viel, wenn Sie etwas programmgesteuert tun möchten. Also habe ich meine eigene Frage zusammengestellt:

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
;

Vorteile:

  • Ich kann leicht nach vielen verschiedenen Informationen filtern, wie dem Objekt, dem Privileg, ob es sich um eine bestimmte Rolle handelt usw., indem ich diese einfach ändere WHERE Klausel ändere.
  • Es ist eine einzelne Abfrage, was bedeutet, dass ich die Ergebnisse nicht mental zusammensetzen muss.
  • Es löst das Problem, ob sie das Privileg gewähren können oder nicht und ob es die Privilegien für Unterobjekte (den "hierarchischen" Teil) über verschiedene Quellen des Privilegs hinweg enthält.
  • Es ist leicht zu sehen, was ich tun muss, um das Privileg zu widerrufen, da alle Quellen des Privilegs aufgelistet sind.
  • Es kombiniert Tabellen- und Systemberechtigungen in einer einzigen zusammenhängenden Ansicht, sodass wir alle auflisten können Berechtigungen eines Benutzers auf einen Schlag aufzulisten.
  • Es ist eine Abfrage , keine Funktion, die all dies ausspucktDBMS_OUTPUT oder so (im Vergleich zu Pete Finnigans verknüpftem Skript). Dies macht es nützlich für die programmatische Verwendung und für den Export.
  • Der Filter wird nicht wiederholt; es erscheint nur einmal. Dies erleichtert das Ändern.
  • Die Unterabfrage kann leicht herausgezogen werden, wenn Sie sie von jedem Einzelnen prüfen müssen GRANT.
jpmc26
quelle
Einige TODOs für mich: 1. Fügen Sie einen Indikator hinzu, wenn der Benutzer das Privileg gewähren kann, indem er einem anderen Benutzer eine Rolle gewährt . 2. Finden Sie heraus, wie dies für aktuelle Benutzer ohne DBA-Berechtigungen durchgeführt wird. Möglicherweise handelt es sich um USER_SYS_PRIVS(direkt gewährte Systemberechtigungen), USER_TAB_PRIVS(direkt gewährte Objektprivilegien) USER_ROLE_PRIVS(direkt gewährte Rollen des Benutzers), ROLE_ROLE_PRIVS(zum ROLE_SYS_PRIVSAbrufen geerbter Rollen), (Systemprivilegien über Rollen) und ROLE_TAB_PRIVS(Objektprivilegien über Rollen). Pfui. Oracle ist so kompliziert.
jpmc26
1

Sie können den folgenden Code verwenden, um alle Berechtigungslisten von allen Benutzern abzurufen.

select * from dba_sys_privs 
Ravi Bhushan
quelle
Dies listet nicht alle Berechtigungen auf. Wie aus mehreren anderen Antworten hervorgeht, die jahrelang Ihren Antworten vorausgingen , werden Tabellenberechtigungen und alle durch Rollen gewährten Berechtigungen weggelassen.
jpmc26
-1

So zeigen Sie alle Berechtigungen an:

Wählen Sie den Namen aus system_privilege_map aus.

Yerbol Baigarayev
quelle