catalog.sql指令碼介紹

Davis_itpub發表於2018-06-27

        前面介紹瞭如何透過手工建立資料庫,在建立資料庫之後執行了指令碼$ORACLA_HOME/rdbms/admin/catalog.sql指令碼,這裡著重介紹一下該指令碼的作用。

        該指令碼使用者建立oracle動態效能檢視,比如v$session,v$session_wait,v$transactoin等。這類效能檢視主要用於監控oracle例項執行的狀態,指令碼檔案開始時的註釋已經說明其作用:

    Rem NAME
    Rem   CATALOG.SQL
    Rem FUNCTION
    Rem   Creates data dictionary views.
    Rem NOTES
    Rem   Must be run when connected AS SYSDBA

必須採用sysdba角色的使用者才可以執行該指令碼。

     下面分析一下常用的v$session來分析一下

     create or replace view v_$session as select * from v$session;
     create or replace public synonym v$session for v_$session;
     grant select on v_$session to select_catalog_role;

      可以發現資料庫透過該執行該指令碼對底層的v$session檢視進一步作了封裝。

透過建立一個新的檢視v_$session,並將該v_$session檢視的查詢許可權分配了

select_catalog_role這個角色,任何user只要擁有select_catalog_role這個角色,都可以透過sys.v_$session來訪問sys使用者的v_$session檢視,但是考慮到使用者訪問的不便,同時也考慮對sys使用者對應檢視的封裝,建立了一個public 同義詞。

擁有select_catalog_role角色的使用者其實訪問的只是v$session這個public同義詞,實現了對底層v$session檢視的封裝隱藏,使用者本身並不知道該檢視時sys使用者還是其他使用者。

        進一步向下檢視,所有的動態效能檢視都是透過這種方式對sys使用者下的檢視做了封裝隱藏。我們可以參照這種做法實現類似的封裝

       
SQL> conn / as sysdba

SQL>create table test(t number(10));

SQL>conn scott/tiger

SQL>select count(*) from test;

ERROR at line 1:
ORA-00942: table or view does not exist

切回到sys使用者

SQL>conn / as sysdba

SQL>create view test_ as select * from test;

View created.

SQL>create public synonym test for test_;

Synonym created.

SQL>grant select on test_ to tiger;

Grant succeeded.

對中間檢視test_查詢許可權分配完畢。切回到scott使用者試下

SQL>conn scott/tiger

Connected.

SQL>select count(*) from test;

  COUNT(*)
----------
         0

可見scott使用者已經可以查詢sys使用者下的test表。但是實際上使用者查詢的僅僅是這個public synonym。

catalog指令碼中還需要注意一點,所有的v_$檢視的查詢許可權都分配給了select_catalog_role這個角色,意味著只要使用者分配給了該角色,就能查詢該指令碼中所有的v$效能檢視。

SQL> grant select_catalog_role to scott;

Grant succeeded.
SQL> conn scott/tiger
Connected.
SQL> select count(*) from v$session;

  COUNT(*)
----------
        17

scott使用者已經可以查詢v$session檢視,否則scott使用者按照utlsampl.sql建立之後不允許查詢v$之類的效能檢視。

而select_catalog_role這個角色是在執行建立oracle資料庫指令碼時自動建立的,由於oracle建立資料庫時會自動執行$ORACLE_HOME/rdbms/admin/sql.bsq指令碼。我們透過該指令碼,可以看到具體如下:
/
create role select_catalog_role
/
create role execute_catalog_role
/
create role delete_catalog_role
/
grant select_catalog_role to dba with admin option
/
grant execute_catalog_role to dba with admin option
/
grant delete_catalog_role to dba with admin option

可以看到建庫時oracle自動建立了select_catalog_role這個角色,將該角色賦予給dba角色,並允許dba角色的使用者賦予許可權。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156754/,如需轉載,請註明出處,否則將追究法律責任。

相關文章