这篇文章给大家介绍catalog.sql脚本怎么编写,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
前面介绍了如何通过手工创建数据库,在创建数据库之后执行了脚本$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角色的用户赋予权限。
关于catalog.sql脚本怎么编写就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。