前面介绍了如何通过手工创建数据库,在创建数据库之后执行了脚本$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/7483882/viewspace-757535/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7483882/viewspace-757535/