누군가가 sql-console에서 특정 사용자의 모든 권한 / 규칙을 표시하는 방법을 알려주시겠습니까?
답변
아래보기를 시도 할 수 있습니다.
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의 스크립트는 이러한 관계를 통해 사용자에게 전달되는 모든 권한을 보여줍니다.
답변
답변
반면 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
.
답변
아래 코드를 사용하여 모든 사용자로부터 모든 권한 목록을 얻을 수 있습니다.
select * from dba_sys_privs
답변
모든 권한을 표시하려면 :
system_privilege_map에서 이름을 선택하십시오.