it-swarm.com.de

Wie zeige ich alle Privilegien eines Benutzers in Oracle?

Kann mir bitte jemand sagen, wie ich alle Berechtigungen/Regeln eines bestimmten Benutzers in der SQL-Konsole anzeigen kann?

97
destiny

Sie können diese Ansichten ausprobieren.

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

Datenbankadministratoren und andere Hauptbenutzer finden die Berechtigungen, die anderen Benutzern mit den DBA_-Versionen dieser Ansichten gewährt werden. Sie sind in der Dokumentation enthalten.

Diese Ansichten zeigen nur die Privilegien, die direkt dem Benutzer erteilt wurden. Die Suche nach all der Berechtigungen, einschließlich der indirekt über Rollen gewährten Berechtigungen, 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;
141
Teja

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

Wenn Sie es selbst schreiben möchten, wird die Abfrage ziemlich schwierig. Benutzern können Systemprivilegien gewährt werden, die in DBA_SYS_PRIVS sichtbar sind. Ihnen können Objektprivilegien gewährt werden, die in DBA_TAB_PRIVS sichtbar sind. Ihnen können Rollen zugewiesen werden, die in DBA_ROLE_PRIVS sichtbar sind (Rollen können Standard oder Nicht-Standard sein und können auch ein Kennwort erfordern. Wenn ein Benutzer eine Rolle erhalten hat, bedeutet das nicht, dass der Benutzer die Berechtigungen unbedingt verwenden kann er erwarb durch die Rolle standardmäßig). Diesen Rollen können wiederum Systemprivilegien, Objektprivilegien und zusätzliche Rollen gewährt werden, die durch Anzeigen von ROLE_SYS_PRIVS, ROLE_TAB_PRIVS und ROLE_ROLE_PRIVS angezeigt werden können. Das Skript von Pete durchläuft diese Beziehungen, um alle Berechtigungen anzuzeigen, die am Ende für einen Benutzer gelten.

18
Justin Cave

Eine weitere nützliche Ressource:

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

  • DBA_SYS_PRIVS 
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS
6
Ageu

Mit dem folgenden Code können Sie alle Privilegienlisten aller Benutzer abrufen.

select * from dba_sys_privs 
1
Ravi Bhushan

Während Raviteja Vutukuris Antwort arbeitet und schnell zusammengefügt werden kann, ist es nicht besonders flexibel, um die Filter zu variieren, und es hilft nicht viel, wenn Sie programmgesteuert etwas tun möchten. Also stellte ich meine eigene Anfrage zusammen:

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 einfach diese eine WHERE-Klausel ändere.
  • Es ist eine einzelne Abfrage, das heißt, ich muss die Ergebnisse nicht mental zusammenstellen.
  • Es wird die Frage gelöst, ob sie das Privileg gewähren können oder nicht und ob es die Privilegien für Unterobjekte (den "hierarchischen" Teil) über unterschiedliche Quellen des Privilegs einschließt.
  • Es ist leicht zu sehen, was ich alles tun muss, um das Privileg zu widerrufen, da es alle Quellen des Privilegs auflistet.
  • Es kombiniert Tabellen- und Systemprivilegien in einer einzigen kohärenten Ansicht, sodass wir all die Privilegien eines Benutzers auf einen Schlag auflisten können.
  • Es ist eine query, keine Funktion, die all dies in DBMS_OUTPUT oder etwas (im Vergleich zu dem verknüpften Skript von Pete Finnigan) spuckt. Dies macht es nützlich für programmatische Zwecke und für den Export.
  • Der Filter wird nicht wiederholt. es erscheint nur einmal. Dies erleichtert das Ändern.
  • Die Unterabfrage kann einfach herausgezogen werden, wenn Sie von jedem einzelnen GRANT untersucht werden müssen.
0
jpmc26

So zeigen Sie alle Berechtigungen an:

wählen Sie den Namen aus system_privilege_map.

0