控制普通用户访问数据字典
默认情况下普通用户是不能够访问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