控制普通使用者訪問資料字典

pingley發表於2012-05-28
控制普通使用者訪問資料字典
預設情況下普通使用者是不能夠訪問sys schema 中的資料字典的。
SQL> create user testdic identified by test
  2  default tablespace users
  3  temporary tablespace temp;
User created.
SQL> grant create session to testdic;
Grant succeeded.
SQL> conn testdic/test
Connected.
SQL> select count(*) from user_users;
  COUNT(*)
----------
         1
SQL> select count(*) from dba_users;--不能訪問位於sys schema 中的資料字典。
select count(*) from dba_users
                     *
ERROR at line 1:
ORA-00942: 表或檢視不存在
現實中,普通使用者往往需要訪問資料字典來獲得所需要的資訊,這時候可以透過以下的
幾種方式來達到。
一、授予普通使用者select any dictionary 系統許可權。
SQL> conn sys as sysdba
Enter password:
Connected.
SQL> grant select any dictionary to testdic;
Grant succeeded.
SQL> conn testdic/test
Connected.
SQL> select count(*) from dba_users;--可以訪問資料字典了。
  COUNT(*)
----------
        23
SQL> select count(*) from v$session;
  COUNT(*)
----------
        22
SQL> select count(*) from hr.employees;--但是不能夠訪問其他schema 中的物件。
select count(*) from hr.employees
                        *
ERROR at line 1:
ORA-00942: 表或檢視不存在
二、給普通使用者授予select_catalog_role 角色。
SQL> conn sys as sysdba
Enter password:
Connected.
SQL> revoke select any dictionary from testdic;
Revoke succeeded.
SQL> grant select_catalog_role to testdic;
Grant succeeded.
SQL> conn testdic/test
Connected.
SQL> select count(*) from dba_users;
  COUNT(*)
----------
        23
SQL> select count(*) from V$session;
  COUNT(*)
----------
        22
三、在o7_dictionary_accessibility 引數設定為 true 的時候,普通使用者獲得select any table 系統許可權也可以訪問sys schema 中的資料字典。
SQL> show parameter o7
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ----------
O7_DICTIONARY_ACCESSIBILITY          boolean                FALSE
SQL> revoke select_catalog_role from testdic;
Revoke succeeded.
SQL> grant select any table to testdic;
Grant succeeded.
SQL> conn testdic/test
Connected.
SQL> select count(*) from hr.employees;--可以訪問其他普通使用者schema 中的表。
  COUNT(*)
----------
       107
SQL> select count(*) from dba_users;
select count(*) from dba_users
                     *
ERROR at line 1:
ORA-00942: 表或檢視不存在
因為o7_dictionary_accessibility 引數設定為 false,所以不能訪問sys schema 中的資料字典。在oracle 9i 起該引數的預設值為false,這樣就可以限制帶有any 的系統許可權訪問 sys 中的物件,在其他更早oracle版本中o7_dictionary_accessibility 是預設為true 的,也不應該透過授予使用者select any table 系統許可權的方式來讓他訪問資料字典,因為這樣使用者可以訪問其他schema 中的物件。留下安全隱患。
注:如果知道普通使用者只需要訪問固定的幾張資料字典,可以透過以下的方式來授予許可權。假如hr 使用者只需要訪問 dba_users 等幾個資料字典表。可以透過一一授予物件許可權的方式或者把這些物件的相應許可權授予role ,再把role 授權給hr.
SQL> conn hr/hr
Connected.
SQL> select count(*) from dba_users;
select count(*) from dba_users
                     *
ERROR at line 1:
ORA-00942: 表或檢視不存在
SQL> conn sys as sysdba
Enter password:
Connected.
SQL> grant select on dba_users to hr;
Grant succeeded.
SQL> conn hr/hr
Connected.
SQL> select count(*) from dba_users;
  COUNT(*)
----------
        23

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

相關文章