catalog.sql脚本怎么编写

这篇文章给大家介绍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脚本怎么编写就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/200224.html

(0)
上一篇 2021年11月20日
下一篇 2021年11月20日

相关推荐

发表回复

登录后才能评论