DBA_TAB_PRIVSではユーザーとロールに付与されているオブジェクト権限を確認する事ができます。どのユーザ及びロールが どのオブジェクト(テーブル、VIEW、シーケンスetc)にアクセスできるのか知る事ができます。 Oracleの一般的な権限にはこのオブジェクト権限とシステム権限(DBA_SYS_PRIVS で確認できます)があります。システム権限では主にシステム運用や管理で必要になってくる操作を制限しています。このDBA_TAB_PRIVS と DBA_SYS_PRIVS、 そして DBA_ROLE_PRIVS この3つのデータディクショナリをみれば、そのユーザは何ができるのか一通り把握する事ができます。 (実はもう一つ管理操作をするための「管理権限」が存在します。システム権限に含まれそうですが厳密には異なります。)
DBA_TAB_PRIVSの確認例
select * from dba_tab_privs t where t.GRANTEE = 'SOONI' order by t.GRANTEE,t.TABLE_NAME;
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTA HIERAR COMMON TYPE
---------- ---------- -------------------------- ---------- ---------- ------ ------ ------ ----------
SOONI SYS DBMS_WORKLOAD_REPOSITORY SYS EXECUTE NO NO NO PACKAGE
SOONI SCOTT PRODUCT_MST SCOTT DELETE NO NO NO TABLE
SOONI SCOTT PRODUCT_MST SCOTT INSERT NO NO NO TABLE
SOONI SCOTT PRODUCT_MST SCOTT UPDATE NO NO NO TABLE
SOONI SCOTT PRODUCT_MST SCOTT SELECT NO NO NO TABLE
SQL>
SOONIは、SYSが保有するDBMS_WORKLOAD_REPOSITORYパッケージを実行できる権限を持っていて、これはSYSユーザが付与しています。
SOONIは、SCOTTが保有するPRODUCT_MSTテーブルをUPDETE/SELECT/DELETE/INSERTする権限を保有している事、この権限付与をしたのはSCOTTである事など確認できます。
DBA_TAB_PRIVS ってそもそも何なのか?
as sysdbaでログインしてDBA_OBJECTSを参照する事で確認できます。
select owner,object_name,object_type,status ,t.CREATED from all_objects t where t.OBJECT_NAME = 'DBA_TAB_PRIVS';
$ sqlplus / as sysdba
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SQL> set lin 100
SQL> col owner for a10
SQL> col object_name for a20
SQL> col object_type for a10
SQL> col status for a8
SQL> alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';
セッションが変更されました。
--
-- 以下の通り SYS.DBA_TAB_PRIVS(VIEW)をパブリックシノニムで定義してある
-- 事確認できます。
SQL> select owner,object_name,object_type,status ,t.CREATED from all_objects t
2 where t.OBJECT_NAME = 'DBA_TAB_PRIVS';
OWNER OBJECT_NAME OBJECT_TYP STATUS CREATED
---------- -------------------- ---------- -------- -------------------
SYS DBA_TAB_PRIVS VIEW VALID 2014/07/07 05:40:27
PUBLIC DBA_TAB_PRIVS SYNONYM VALID 2014/07/07 05:40:27
-- dbms_metadata.get_ddl()を使ってPUBLIC.DBA_TAB_PRIVSのソースを見てみます
-- (先頭200文字見れば十分)
SQL> select DBMS_LOB.SUBSTR(dbms_metadata.get_ddl('SYNONYM','DBA_TAB_PRIVS','PUBLIC'),200,1) from dual
2 ;
DBMS_LOB.SUBSTR(DBMS_METADATA.GET_DDL('SYNONYM','DBA_TAB_PRIVS','PUBLIC'),200,1)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE NONEDITIONABLE PUBLIC SYNONYM "DBA_TAB_PRIVS" FOR "SYS"."DBA_TAB_PRIVS"
SQL>
SQL*Plus用
set lin 200 col GRANTEE for a10 col OWNER for a10 col TABLE_NAME for a26 col GRANTOR for a10 col PRIVILEGE for a10 col TYPE for a10 col object_name for a20 col object_type for a10 col status for a8