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 ;

