Antworten:
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;
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_PRIVS
und ROLE_ROLE_PRIVS
. Petes Skript geht diese Beziehungen durch, um alle Berechtigungen anzuzeigen, die einem Benutzer letztendlich zufließen.
SYS
Privilegien haben und nur die Privilegien unseres eigenen Kontos betrachten möchten, ist das Skript absolut wertlos. Ich habe weder Zugriff auf UTL_FILE
noch auf DBA_SYS_PRIVS
die anderen DBA
und SYS
Bereiche, auf die sich das Skript bezieht.
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
und ROLE_ROLE_PRIVS
Bedürfnisse untersucht werden. Die Dokumente geben an, dass sie für den aktuellen Benutzer bestimmt sind.
Eine weitere nützliche Ressource:
http://psoug.org/reference/roles.html
DBA
oder keine SYS
Rollen haben und nur die Berechtigungen Ihres eigenen Kontos suchen möchten.
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:
WHERE
Klausel ändere.DBMS_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.GRANT
.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_PRIVS
Abrufen geerbter Rollen), (Systemprivilegien über Rollen) und ROLE_TAB_PRIVS
(Objektprivilegien über Rollen). Pfui. Oracle ist so kompliziert.
Sie können den folgenden Code verwenden, um alle Berechtigungslisten von allen Benutzern abzurufen.
select * from dba_sys_privs
So zeigen Sie alle Berechtigungen an:
Wählen Sie den Namen aus system_privilege_map aus.