Oracle DBですべての許可を確認する必要があります。
TOAD機能を使用してスキーマを比較しましたが、temptableの許可などが表示されないため、質問があります。
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;
すべてのobjects特定のユーザーが持っているreceivedの許可を一覧表示すると仮定します。
select * from all_tab_privs_recd where grantee = 'your user'
これは、ユーザーが所有するオブジェクトを返しません。これらが必要な場合は、代わりにall_tab_privs
ビューを使用してください。
申し訳ありませんが、all_tab_privs_recdからgrantee = 'your user'を選択しても、別の(たとえばSYS)ユーザーからselectを実行した場合、パブリック許可と現在のユーザー許可を除いて出力は提供されません。ドキュメントが言うように、
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自体ではない)ユーザーのすべてのobject権限をリストしたい場合、そのシステムビューを使用することはできません。
この場合、より複雑なクエリを実行する必要があります。次に、特定のユーザーのすべてのオブジェクト許可を選択するために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にはno 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')
;