ユーザーが受け取ったすべての許可をどのようにリストできますか?


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

1
正解です。DBAに連絡してください。拒否した場合、正当なセキュリティ上の懸念がある可能性があります。これらのビューのコンテンツを見ると、他の方法では取得できない情報がユーザーに提供されます。
DCookie 2014年

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

申し訳ありませんが、grantee = 'your user'の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'句で始まる選択のすべての部分を削除します。

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
他の人が来て見つけたときのために、いくつかの説明はこの答えを助けるでしょう。
アンドリューバーバー

0

次のクエリは、1人のユーザーのすべての特権を取得するために使用できます。最初のクエリでユーザー名を指定するだけで、そのすべての特権を取得できます

WITHユーザーAS(SELECT 'SCHEMA_USER' usr FROM dual)、ロール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 users.dtp.grantee usr)、sys_privileges AS(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.