Oracle角色管理

      oracle的安全管理不仅可以通过对不同用户进行权限授予与撤销(revoke命令),但是在涉及到多张表和多个用户时,这样操作会造成工具量剧增;此外,一旦为用户授予某一权限则该用户在所有环境中均具有该权限,无法限制在特定环境中授予用户活动状态的权限。因此,oracle还提供了角色管理,角色是一组系统权限和对象权限,可以对一个用户进行批量权限授予。

     使用以下命令可以创建一个角色:

SQL> create role db_mgr1;

角色已创建。

      可以通过以下命令为角色授予特定的对象权限(即对某一些用户所拥有模式对象的CRUD操作权限):

SQL> grant select on scott.emp to db_mgr1;

授权成功。

       表明db_mgr1角色将具有scott.emp表对象的select权限,随后将这个角色授予给一个特定的用户:yanh;

SQL> grant db_mgr1 to yanh;

授权成功。

SQL> conn yanh/oracle@orcl;
已连接。
SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80           3388                    20

      此时,使用yanh账户连接数据库将可以对scott.emp表进行查询操作,若执行insert、update、delete(DML)操作,则会出现权限不足的情况:

SQL> edit;
已写入 file afiedt.buf

  1  insert into scott.emp(empno,ename,job,sal,hiredate)
  2* values('1234','helen','Mgr','8000',sysdate)
SQL> /
insert into scott.emp(empno,ename,job,sal,hiredate)
                  *
第 1 行出现错误:
ORA-01031: 权限不足

       在oracle数据库中,拥有很多预先定义的角色,常见的有:

      1)connect,在oracle11g中,这个角色只拥有Create session权限,其存在仅仅是为了向后兼容,先前版本中还具有创建数据存储对象的系统权限。

      2)resource,这个角色具有创建数据对象(表、视图、索引等)和过程对象(PL/SQL程序片段),还具有unlimited tablespace权限。

      3)dba,拥有大多数系统权限,包含多个对象权限和角色,授予dba角色的用户可以管理数据库的大部分功能。

      4)select_catalog_role,拥有针对数据字典对象的多个对象权限,没有系统权限也没有针对用户数据的权限。

      5)schedule_admin,拥有用于管理调度服务的调度程序作业所需的系统权限。

      6)public,数据库预定义的角色,在每一个用户创建时都会授予该权限。如果将某一个对象的对象权限授予给public角色,如:

SQL> grant select on scott.dept to public;

授权成功。

      则所有用户都能查询到scott.dept表。

      可以使用以下SQL查询某个用户具有的角色权限:

SQL> select * from dba_role_privs where grantee='YANH';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
YANH                           DB_MGR1                        NO  YES

      以上结果表明,用户yanh在登录数据库服务器时即启用db_mgr1角色,拥有该角色的一切管理职能。可以使用alter命令来更改特定用户的登录启用角色:

SQL> grant connect to yanh;

授权成功。

SQL> alter user yanh default role connect;

用户已更改。

SQL> select * from dba_role_privs where grantee='YANH';

GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
YANH                           DB_MGR1                        NO  NO
YANH                           CONNECT                        NO  YES

       此时,用户yanh在登录时会启用connect角色,并不具有db_mgr1角色下的表数据管理职能。通过set role命令可以指定用户的角色,这样还不算安全,因为用户可以选择手动执行该命令:

SQL> select * from scott.emp;
select * from scott.emp
                    *
第 1 行出现错误:
ORA-00942: 表或视图不存在

SQL> set role db_mgr1;

角色集

SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80           3388                    20

     若使用以下语法来创建角色:

SQL> create role db_mgr identified using time_chk;

角色已创建。

     这表明db_mgr角色在启动时,必须调用time_chk存储过程,在这个过程调用中可以执行多次安全检查:例如时间合法性校验、网段校验等等,示例的存储过程代码如下:

create or replace procedure time_chk(errcd out varchar2) is
       invalid_time exception;
begin
  if to_char(sysdate,'HH24') not in('08','09','10','11','12','13','14','15','16','17','18') then
     errcd:='not work time!';
     raise  invalid_time;
  end if;
  exception when invalid_time then
      RAISE_APPLICATION_ERROR(-20001,errcd);
  when others then
     RAISE_APPLICATION_ERROR(-20001,'other error');
end time_chk;

相关推荐