답변:
아래보기를 시도 할 수 있습니다.
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
DBA 및 기타 고급 사용자는 DBA_
이러한 동일한보기 버전을 사용하여 다른 사용자에게 부여 된 권한을 찾을 수 있습니다. 문서 에서 다룹니다 .
이러한보기 는 사용자 에게 직접 부여 된 권한 만 표시합니다 . 찾는 모든 역할을 통해 간접적으로 부여 된 포함한 권한은 더 복잡 재귀 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;
원하는 정도에 따라 다양한 스크립트가 떠 다니고 있습니다. 개인적으로 Pete Finnigan의 find_all_privs 스크립트를 사용 합니다.
직접 작성하려는 경우 쿼리가 다소 어려워집니다. 사용자는에서 볼 수있는 시스템 권한을 부여받을 수 있습니다 DBA_SYS_PRIVS
. 에서 볼 수있는 객체 권한을 부여받을 수 있습니다 DBA_TAB_PRIVS
. 또한 다음에서 볼 수있는 역할을 부여 할 수 있습니다 DBA_ROLE_PRIVS
(역할은 기본값이거나 기본값이 아닐 수 있으며 암호도 요구할 수 있습니다. 따라서 사용자에게 역할이 부여되었다고해서 사용자가 반드시 자신의 권한을 사용할 수 있다는 의미는 아닙니다. 기본적으로 역할을 통해 획득). 하지만 그 역할은, 차례로, 부여 된 시스템 권한, 오브젝트 특권 및보고 볼 수있는 추가 역할을 할 수있다 ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
하고 ROLE_ROLE_PRIVS
. Pete의 스크립트는 이러한 관계를 통해 사용자에게 전달되는 모든 권한을 보여줍니다.
SYS
특권이없고 우리 자신의 계정의 특권을보고자 하는 사람들에게는 대본이 전혀 쓸모가 없습니다. 나는 스크립트가 보는 다른 영역 과 영역에 대한 액세스 권한이 UTL_FILE
없습니다 . DBA_SYS_PRIVS
DBA
SYS
ROLE_SYS_PRIVS
, ROLE_TAB_PRIVS
및 ROLE_ROLE_PRIVS
요구 조사 할 수 있습니다. 문서는 현재 사용자를 위한 것임을 나타냅니다 .
DBA
또는 SYS
역할 이없고 자신의 계정의 권한을 찾고자하는 경우는 예외 입니다.
반면 Raviteja Vutukuri의 응답 작품과 함께 넣어 신속하게, 그것은 필터를 변화 특히 유연하지 그리고 프로그래밍 뭔가를 찾고 있다면 너무 많은 도움이되지 않습니다. 그래서 내 자신의 쿼리를 작성했습니다.
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
;
장점 :
WHERE
절 .DBMS_OUTPUT
(Pete Finnigan의 링크 된 스크립트와 비교). 따라서 프로그래밍 방식으로 사용하고 내보낼 때 유용합니다.GRANT
.USER_SYS_PRIVS
(직접 부여 된 시스템 권한), USER_TAB_PRIVS
(직접 부여 된 객체 privs) USER_ROLE_PRIVS
(사용자가 직접 부여한 역할), ROLE_ROLE_PRIVS
(상속 된 역할을 얻기 위해), ROLE_SYS_PRIVS
(역할을 통한 시스템 privs) 및 ROLE_TAB_PRIVS
(역할을 통한 객체 priv)를 포함합니다. 으. 오라클은 너무 복잡합니다.
모든 권한을 표시하려면 :
system_privilege_map에서 이름을 선택하십시오.