사용자가받은 모든 권한을 어떻게 나열 할 수 있습니까?
Oracle DB에서 모든 권한을 확인해야합니다.
TOAD 기능을 사용하여 스키마를 비교했지만 임시 부여 등을 표시하지 않으므로 내 질문이 있습니다.
Oracle DB의 모든 권한을 어떻게 나열 할 수 있습니까?
직접 테이블 부여 (예 : 역할을 통한 부여, 테이블 선택 등의 시스템 권한) 이상을 원하는 경우 다음과 같은 몇 가지 추가 쿼리가 있습니다.
사용자의 시스템 권한 :
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;
특정 사용자가 받은 모든 개체에 대한 권한 부여를 나열한다고 가정합니다 .
select * from all_tab_privs_recd where grantee = 'your user'
이것은 사용자가 소유 한 객체를 반환하지 않습니다. 필요한 경우 all_tab_privs
대신보기를 사용하십시오.
죄송합니다. 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: Studying the documentation I found another view that lists all grants in much simpler way:
select * from DBA_TAB_PRIVS where grantee = 'your user';
Bear in mind that there's no DBA_TAB_PRIVS_RECD view in Oracle.
The most comprehensive and reliable method I know is still by using 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;
Interesting answers though.
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')
;
참고URL : https://stackoverflow.com/questions/1298473/how-can-i-list-all-grants-a-user-received
'programing' 카테고리의 다른 글
열거 형의 모든 이름을 String []으로 가져 오기 (0) | 2020.09.09 |
---|---|
Maven 릴리스 플러그인을 사용하는 동안 "Git fatal : ref HEAD는 기호 참조가 아닙니다." (0) | 2020.09.09 |
xpath를 사용하여 다음 형제 / xml 태그를 선택하는 방법 (0) | 2020.09.09 |
100 개의 움직이는 표적 사이의 최단 경로를 어떻게 찾을 수 있습니까? (0) | 2020.09.08 |
왜 yield return이 catch가있는 try 블록 안에 나타나지 않습니까? (0) | 2020.09.08 |