Oracle에서 사용자의 모든 권한을 표시하는 방법은 무엇입니까?


113

누군가가 sql-console에서 특정 사용자의 모든 권한 / 규칙을 표시하는 방법을 알려주시겠습니까?

답변:


164

아래보기를 시도 할 수 있습니다.

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;

21

원하는 정도에 따라 다양한 스크립트가 떠 다니고 있습니다. 개인적으로 Pete Finnigan의 find_all_privs 스크립트를 사용 합니다.

직접 작성하려는 경우 쿼리가 다소 어려워집니다. 사용자는에서 볼 수있는 시스템 권한을 부여받을 수 있습니다 DBA_SYS_PRIVS. 에서 볼 수있는 객체 권한을 부여받을 수 있습니다 DBA_TAB_PRIVS. 또한 다음에서 볼 수있는 역할을 부여 할 수 있습니다 DBA_ROLE_PRIVS(역할은 기본값이거나 기본값이 아닐 수 있으며 암호도 요구할 수 있습니다. 따라서 사용자에게 역할이 부여되었다고해서 사용자가 반드시 자신의 권한을 사용할 수 있다는 의미는 아닙니다. 기본적으로 역할을 통해 획득). 하지만 그 역할은, 차례로, 부여 된 시스템 권한, 오브젝트 특권 및보고 볼 수있는 추가 역할을 할 수있다 ROLE_SYS_PRIVS, ROLE_TAB_PRIVS하고 ROLE_ROLE_PRIVS. Pete의 스크립트는 이러한 관계를 통해 사용자에게 전달되는 모든 권한을 보여줍니다.


스크립트는 굉장합니다 방금 확인했습니다
I.Tyger 2014

1
UTL_FILE 패키지에 대한 권한이 필요합니다. 그렇지 않으면 Pete Finnigan의 스크립트를 실행할 때 "식별자 'UTL_FILE'을 선언해야합니다."라는 오류가 발생합니다. SQL Developer를 통해 롤 sysdba를 사용하여 sys로 연결할 수 있으며 다음을 사용하여 작동하거나이 패키지에 대한 실행 권한을 부여합니다. grant execute on UTL_FILE to <user>;
1

1
그리고 SYS특권이없고 우리 자신의 계정의 특권을보고자 하는 사람들에게는 대본이 전혀 쓸모가 없습니다. 나는 스크립트가 보는 다른 영역 과 영역에 대한 액세스 권한이 UTL_FILE없습니다 . DBA_SYS_PRIVSDBASYS
vapcguy

나는 생각하지 않는다 ROLE_SYS_PRIVS, ROLE_TAB_PRIVSROLE_ROLE_PRIVS요구 조사 할 수 있습니다. 문서는 현재 사용자를 위한 것임을 나타냅니다 .
jpmc26

이 스크립트의 사본이있는 사람이 있다면 여기에 게시 할 수 있습니까? 아니면 요점처럼 좀 더 상록수에 게시 할 수 있습니까? 사이트가 다운되었습니다.
Michael Thompson


2

반면 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.

나 자신을위한 일부 TODO : 1. 사용자 가 다른 사용자 에게 역할 을 부여하여 권한을 부여 할 수 있는지 표시기 를 추가합니다. 2. DBA 권한이없는 현재 사용자에 대해이 작업을 수행하는 방법을 알아 봅니다. 아마도 USER_SYS_PRIVS(직접 부여 된 시스템 권한), USER_TAB_PRIVS(직접 부여 된 객체 privs) USER_ROLE_PRIVS(사용자가 직접 부여한 역할), ROLE_ROLE_PRIVS(상속 된 역할을 얻기 위해), ROLE_SYS_PRIVS(역할을 통한 시스템 privs) 및 ROLE_TAB_PRIVS(역할을 통한 객체 priv)를 포함합니다. 으. 오라클은 너무 복잡합니다.
jpmc26

1

아래 코드를 사용하여 모든 사용자로부터 모든 권한 목록을 얻을 수 있습니다.

select * from dba_sys_privs 

모든 권한이 나열되지는 않습니다. 년 전의 다른 답변에서 알 수 있듯이 테이블 권한과 역할을 통해 부여 된 모든 권한이 생략됩니다.
jpmc26

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.