사용자가받은 모든 권한을 어떻게 나열 할 수 있습니까?


97

Oracle DB에서 모든 권한을 확인해야합니다.

TOAD 기능을 사용하여 스키마를 비교했지만 임시 부여 등을 표시하지 않으므로 내 질문이 있습니다.

Oracle DB의 모든 권한을 어떻게 나열 할 수 있습니까?

답변:


141

직접 테이블 부여 (예 : 역할을 통한 부여, 테이블 선택 등의 시스템 권한) 이상을 원하는 경우 다음과 같은 몇 가지 추가 쿼리가 있습니다.

사용자의 시스템 권한 :

SELECT PRIVILEGE
  FROM sys.dba_sys_privs
 WHERE grantee = <theUser>
UNION
SELECT PRIVILEGE 
  FROM dba_role_privs rp JOIN role_sys_privs rsp ON (rp.granted_role = rsp.role)
 WHERE rp.grantee = <theUser>
 ORDER BY 1;

테이블 / 뷰에 대한 직접 부여 :

SELECT owner, table_name, select_priv, insert_priv, delete_priv, update_priv, references_priv, alter_priv, index_priv 
  FROM table_privileges
 WHERE grantee = <theUser>
 ORDER BY owner, table_name;

테이블 / 뷰에 대한 간접 부여 :

SELECT DISTINCT owner, table_name, PRIVILEGE 
  FROM dba_role_privs rp JOIN role_tab_privs rtp ON (rp.granted_role = rtp.role)
 WHERE rp.grantee = <theUser>
 ORDER BY owner, table_name;

1
sys.dba_sys_privs 테이블을 볼 수있는 권한이 없을 수 있습니다.
Hannes 2014 년

1
절대적으로 맞습니다. DBA를 참조하십시오. 거부하는 경우 합법적 인 보안 문제가있을 수 있습니다. 이러한 뷰의 내용을 보면 다른 방법으로는 가질 수없는 사용자 정보가 제공됩니다.
DCookie

2
왼쪽 조인 재미있을 것 role_role_privs테이블을 다음 CONNECT BY PRIOR granted_role = role전이 역할 권한으로 재귀하는 ...
루카스 에더

33

특정 사용자가 받은 모든 개체에 대한 권한 부여를 나열한다고 가정합니다 .

select * from all_tab_privs_recd where grantee = 'your user'

이것은 사용자가 소유 한 객체를 반환하지 않습니다. 필요한 경우 all_tab_privs대신보기를 사용하십시오.


20

죄송합니다. all_tab_privs_recd에서 피부 여자 = '사용자'를 선택하면 다른 (예 : SYS) 사용자로부터 선택을 실행하는 경우 공개 허가 및 현재 사용자 허가를 제외한 어떠한 출력도 제공되지 않습니다. 문서에 따르면

ALL_TAB_PRIVS_RECD는 다음 유형의 부여를 설명합니다.

Object grants for which the current user is the grantee
Object grants for which an enabled role or PUBLIC is the grantee

따라서 DBA이고 특정 (SYS 자체가 아님) 사용자에 대한 모든 개체 부여 를 나열하려는 경우 해당 시스템보기를 사용할 수 없습니다.

이 경우 더 복잡한 쿼리를 수행해야합니다. 다음은 특정 사용자에 대한 모든 개체 부여를 선택하기 위해 TOAD에서 가져온 (추적)입니다.

select tpm.name privilege,
       decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
       ue.name grantee,
       ur.name grantor,
       u.name owner,
       decode(o.TYPE#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
                       4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
                       7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
                       11, 'PACKAGE BODY', 12, 'TRIGGER',
                       13, 'TYPE', 14, 'TYPE BODY',
                       19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
                       22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
                       28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
                       32, 'INDEXTYPE', 33, 'OPERATOR',
                       34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
                       40, 'LOB PARTITION', 41, 'LOB SUBPARTITION',
                       42, 'MATERIALIZED VIEW',
                       43, 'DIMENSION',
                       44, 'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN',
                       66, 'JOB', 67, 'PROGRAM', 74, 'SCHEDULE',
                       48, 'CONSUMER GROUP',
                       51, 'SUBSCRIPTION', 52, 'LOCATION',
                       55, 'XML SCHEMA', 56, 'JAVA DATA',
                       57, 'EDITION', 59, 'RULE',
                       62, 'EVALUATION CONTEXT',
                       'UNDEFINED') object_type,
       o.name object_name,
       '' column_name
        from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
             table_privilege_map tpm
        where oa.obj# = o.obj#
          and oa.grantor# = ur.user#
          and oa.grantee# = ue.user#
          and oa.col# is null
          and oa.privilege# = tpm.privilege
          and u.user# = o.owner#
          and o.TYPE# in (2, 4, 6, 9, 7, 8, 42, 23, 22, 13, 33, 32, 66, 67, 74, 57)
  and ue.name = 'your user'
  and bitand (o.flags, 128) = 0
union all -- column level grants
select tpm.name privilege,
       decode(mod(oa.option$,2), 1, 'YES', 'NO') grantable,
       ue.name grantee,
       ur.name grantor,
       u.name owner,
       decode(o.TYPE#, 2, 'TABLE', 4, 'VIEW', 42, 'MATERIALIZED VIEW') object_type,
       o.name object_name,
       c.name column_name
from sys.objauth$ oa, sys.obj$ o, sys.user$ u, sys.user$ ur, sys.user$ ue,
     sys.col$ c, table_privilege_map tpm
where oa.obj# = o.obj#
  and oa.grantor# = ur.user#
  and oa.grantee# = ue.user#
  and oa.obj# = c.obj#
  and oa.col# = c.col#
  and bitand(c.property, 32) = 0 /* not hidden column */
  and oa.col# is not null
  and oa.privilege# = tpm.privilege
  and u.user# = o.owner#
  and o.TYPE# in (2, 4, 42)
  and ue.name = 'your user'
  and bitand (o.flags, 128) = 0;

그러면 (지정된) 사용자에 대한 모든 개체 부여 (열 부여 포함)가 나열됩니다. 열 수준 부여를 원하지 않는 경우 'union'절로 시작하는 select의 모든 부분을 삭제합니다.

UPD : 문서를 연구하면서 훨씬 더 간단한 방법으로 모든 보조금을 나열하는 또 다른보기를 찾았습니다.

select * from DBA_TAB_PRIVS where grantee = 'your user';

Oracle 에는 DBA_TAB_PRIVS_RECD 뷰 가 없습니다 .


12

내가 아는 가장 포괄적이고 신뢰할 수있는 방법은 여전히 DBMS_METADATA 를 사용하는 것입니다 .

select dbms_metadata.get_granted_ddl( 'SYSTEM_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'OBJECT_GRANT', :username ) from dual;
select dbms_metadata.get_granted_ddl( 'ROLE_GRANT', :username ) from dual;

그래도 흥미로운 대답.


5
select distinct 'GRANT '||privilege||' ON '||OWNER||'.'||TABLE_NAME||' TO '||RP.GRANTEE
from DBA_ROLE_PRIVS RP join ROLE_TAB_PRIVS RTP 
on (RP.GRANTED_ROLE = RTP.role)  
where (OWNER in ('YOUR USER') --Change User Name
   OR RP.GRANTEE in ('YOUR USER')) --Change User Name
and RP.GRANTEE not in ('SYS', 'SYSTEM')
;

7
다른 사람들이 와서 그것을 찾을 때 어떤 설명이 도움이 될 것입니다.
Andrew Barber

0

다음 쿼리를 사용하여 한 사용자의 모든 권한을 얻을 수 있습니다 .. 첫 번째 쿼리에서 사용자 이름을 제공하기 만하면 해당 권한을 모두 얻을 수 있습니다.

WITH users AS (SELECT 'SCHEMA_USER'usr FROM dual), Roles AS (SELECT grant_role FROM dba_role_privs rp JOIN users ON rp.GRANTEE = users.usr UNION SELECT grant_role FROM role_role_privs WHERE role IN (SELECT grant_role FROM dba_role_privs rp JOIN users ON rp. GRANTEE = users.usr)), tab_privilage AS (SELECT OWNER, TABLE_NAME, PRIVILEGE FROM role_tab_privs rtp JOIN roles r ON rtp.role = r.granted_role UNION SELECT OWNER, TABLE_NAME, PRIVILEGE FROM Dba_Tab_Privs dtp JOIN Users ON dtp.grantee = users. usr), sys_privileges AS (dba_sys_privs dsp SELECT 권한 FROM dba_sys_privs dsp JOIN users ON dsp.grantee = users.usr) SELECT * FROM tab_privilage ORDER BY owner, table_name --SELECT * FROM sys_privileges

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