データ・ディクショナリ

DBA_SYS_PRIVS ユーザが保持しているシステム権限を確認する

DBA_SYS_PRIVSではユーザーとロールに付与されているシステム権限を確認できます。Oracleにはこのシステム権限とオブジェクト権限があり(オブジェクト権限はDBA_TAB_PRIVSで確認できます)混乱しがちです。GRANT文を発行する時などは特にどちらかを意識する事なく発行できるのでなおさらですね。このDBA_SYS_PRIVSと、DBA_TAB_PRIVSにもう一つ DBA_ROLE_PRIVS、 を加えて私はかってに PRIVS三兄弟と呼んで います。 基本この3つのデータディクショナリをみれば、そのユーザは何ができるのかを把握する事ができます。 (実はもう一つ管理操作をするための「管理権限」が存在します。システム権限に含まれそうですが厳密には異なります。)

確認例
select u.KUBUN,t.GRANTEE,t.PRIVILEGE,t.ADMIN_OPTION 
from DBA_SYS_PRIVS t
inner join
 (
    select r.ROLE,'ROLE' as kubun from DBA_roles r
    union
    select t.USERNAME,'USER' as kubun
    from DBA_users t where t.ACCOUNT_STATUS = 'OPEN'
  ) u
  on t.GRANTEE = u.ROLE
--  where t.PRIVILEGE = 'DROP ANY TABLE'  -- TRUNCATEするにはこの権限が必要
--  where t.PRIVILEGE = 'CREATE SYNONYM'
order by u.KUBUN,t.GRANTEE,t.PRIVILEGE
;
set lin 1000
col grantee for a30
col kubun for a4
col privilege for a46
col admin_option for a4
set pagesize 200
注意点

注意点をひとつ。異なるスキーマのテーブルをtruncateできなくて困った事があります。select,update,delete,insert のオブジェクト権限を保持しているのにtruncateした際に、
「ORA-01031: 権限が不足しています。」と出てしまいます。
これは「DROP ANY TABLE」というシステム権限を付与してあげないといけません。

grant drop any table to scott
;
スポンサーリンク
タイトルとURLをコピーしました