programing

Oracle에서 사용자의 모든 권한을 표시하는 방법

stoneblock 2023. 2. 23. 21:59

Oracle에서 사용자의 모든 권한을 표시하는 방법

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_PRIVSPete의 스크립트는 이러한 관계를 통해 사용자에게 전달되는 모든 특권을 보여줍니다.

또 다른 유용한 리소스:

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

  • DBA_SYS_PRIVS
  • DBA_TAB_PRIVS
  • DBA_ROLE_PRIVS

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, ALL_ROLES_FOR_USER.GRANTED_USER 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 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ()이를 통해 프로그램 사용 및 내보내기에 유용합니다.
  • 필터는 반복되지 않고 1회만 표시됩니다.이를 통해 변경하기가 쉬워집니다.
  • 가 필요한 할 수 .GRANT.

단일 쿼리 오라클 버전이 더 단순합니다.

WITH data 
     AS (SELECT granted_role 
         FROM   dba_role_privs 
         CONNECT BY PRIOR granted_role = grantee 
         START WITH grantee = '&USER') 
SELECT 'SYSTEM'     typ, 
       grantee      grantee, 
       privilege    priv, 
       admin_option ad, 
       '--'         tabnm, 
       '--'         colnm, 
       '--'         owner 
FROM   dba_sys_privs 
WHERE  grantee = '&USER' 
        OR grantee IN (SELECT granted_role 
                       FROM   data) 
UNION 
SELECT 'TABLE'    typ, 
       grantee    grantee, 
       privilege  priv, 
       grantable  ad, 
       table_name tabnm, 
       '--'       colnm, 
       owner      owner 
FROM   dba_tab_privs 
WHERE  grantee = '&USER' 
        OR grantee IN (SELECT granted_role 
                       FROM   data) 
ORDER  BY 1; 

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

select * from dba_sys_privs 

모든 권한을 표시하려면:

system_map에서 이름을 선택합니다.

언급URL : https://stackoverflow.com/questions/9811670/how-to-show-all-privileges-from-a-user-in-oracle