답변:
직접 테이블 부여 (예 : 역할을 통한 부여, 테이블 선택 등의 시스템 권한) 이상을 원하는 경우 다음과 같은 몇 가지 추가 쿼리가 있습니다.
사용자의 시스템 권한 :
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;
role_role_privs
테이블을 다음 CONNECT BY PRIOR granted_role = role
전이 역할 권한으로 재귀하는 ...
죄송합니다. 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 뷰 가 없습니다 .
내가 아는 가장 포괄적이고 신뢰할 수있는 방법은 여전히 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;
그래도 흥미로운 대답.
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')
;
다음 쿼리를 사용하여 한 사용자의 모든 권한을 얻을 수 있습니다 .. 첫 번째 쿼리에서 사용자 이름을 제공하기 만하면 해당 권한을 모두 얻을 수 있습니다.
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