データ・ディクショナリ

DBA_TAB_PRIVS ユーザに与えられているオブジェクト権限一覧

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
スポンサーリンク
タイトルとURLをコピーしました