角色是保存权限的容器。如果为某个用户授予一个角色,那么为这个角色授予的所有权限都会自动应用于该用户。就角色而言,使用WITH ADMIN OPTION为角色授予的权限不能级联取消。
Oracle 10G中的预定义角色及其被授予的权限
角色 | 被授予的权限 |
DBA | 几乎所有系统权限以及某些角色 |
SELECT_CATALOG_ROLE | 数据字典上的对象权限 |
EXECUTE_CATALOG_ROLE | 数据字典程序包、过程与函数上的对象权限 |
DELETE_CATALOG_ROLE | DELETE ON SYS.AUD$ DELETE ON SYS.FGA_LOG$ |
EXP_FULL_DATABASE | 从数据库中导出数据时查询任何表或序列、执行任何过程或类型以及修改数据字典对象的权限 |
IMP_FULL_DATABASE | 执行导入时,在数据库内除了SYS模式之外的任何模式中创建对象的权限 |
CONNECT | ALTER SESSION CREATE CLUSTER CREATE DBTABASE LINK CREATE SEQUENCE CREATE SESSION CREATE SYNONYM CREATE TABLE CREATE VIEW |
RESOURCE | CREATE CLUSTER CREATE INDEXTYPE CREATE OPERATOR CREATE PROCEDURE CREATE SEQUENCE CREATE TABLE CREATE TRIGGER CREATE TYPE UNLIMITED TABLESPACE(被授予权限时) |
AQ_ADMINISTRATOR_ROLE | Advanced Queuing(对象上的对象权限) CREATE EVALUATION CONTEXT CREATE RULE CREATE RULE SET DEQUEUE ANY QUEUE ENQUEUE ANY QUEUE MANAGE ANY QUEUE |
AQ_USER_ROLE | EXECUTE ON SYS.DBMS_AQ EXECUTE ON SYS.DBMS_AQIN EXECUTE ON SYS.DBMS_AQJMS_INTERNAL EXECUTE ON SYS.DBMS_TRANSFORM |
SCHEDULER_ADMIN | CREATE ANY JOB CREATE JOB EXECUTE ANY CLASS EXECUTE ANY PROGRAM MANAGE SCHEDULE(使用WITH ADMIN OPTION授予上述所有权限) |
PUBLIC | 不具有特殊的权限,不过为PUBLIC角色授予权限时,所有用户都会继承该权限 |
使用EM创建某个用户时,该用户会被自动授予CONNECT角色。
1、创建角色
CREATE ROLE命令的语法如下:
CREATE ROLE rolename [NOT IDENTIFIED | IDENTIFIED BY password | EXTERNALLY | GLOBALLY]; |
执行CREATE ROLE 命令的默认结果是创建一个具有特定名称的角色,并且不需要进行任何身份验证就能够支持指定的用户启用这个角色;希望借助某个应用程序启用一个角色,也可以通过后面加口令的IDENTIFIED BY子句;也可以用IDENTIFIED EXTERNALLY对角色进行身份验证,意味着启用一个角色,用户必须是操作系统组的一个成员。
IDENTIFIED EXTERNALLY验证:
Oracle初始化参数OS_ROLES设置为TRUE(默认为FALSE)。
必须在数据库驻留服务器上创建具有如下命名约定的组:ora__[_[d][a]]
- <SID>:ORACLE_SID参数值。
- <ROLE>:在数据库中创建的、需要使用IDENTIFIED EXTERNALLY进行身份验证的角色名称。
- d:指示<ROLE>部分指定的角色为用于用户的默认角色。如果指定了a或d,或者同时指定了a或d,它们前面必须使用下划线。
- a:指示可以使用WITH ADMIN OPTION为用户授予<ROLE>部分所指定的角色。如果指定了a或d,或者同时指定了a或d,它们前面必须使用下划线。
例:在我们这个ocp数据库创建一个角色名为dandanAdmin,并且希望这个角色是用于某些用户的默认角色以及使用WITH ADMIN OPTION为另一些用户授予的默认角色,我们应该创建两个组“ora_ocp_dandanAdmin_d”和“ora_ocp_dandanAdmin_da”。
2、修改角色
ALTER ROLE命令修改这个角色的身份验证方法:
ALTER ROLE rolename [NOT IDENTIFIED | IDENTIFIED BY password | EXTERNALLY | GLOBALLY] |
3、为角色授予和出取消权限
为角色授权的方法和为用户授权的方法差不多,下面我们来看看。
为角色授予系统权限语法:
GRANT system_priv [, system_priv, ...] TO role | PUBLIC [, role | PUBLIC, ...] [WITH ADMIN OPTION]; |
为角色授予对象权限语法:
GRANT ALL [PRIVILEGES] | object_priv [(column, column, ...)] [, object_priv [(column, column,...)], ...] ON [schema_name.]object_name TO role | PUBLIC [, role | PUBLIC, ...]; |
取消角色系统权限语法:
REVOKE system_priv | role_name [, system_priv | role_name, ...] FROM role | PUBLIC [, role | PUBLIC, ...]; |
取消角色对象权限语法:
REVOKE ALL [PRIVILEGES] | object_priv [, object_priv, ...] ON [schema_name.]object_name FROM role | PUBLIC [, role | PUBLIC, ...] [CASCADE CONSTRAINTS] |
4、为用户授予和取消角色
使用GRANT命令为用户授予角色语法:
GRANT role_name [, role_name, ...] TO user_name | role | PUBLIC [, user_name | role | PUBLIC, ...] [WITH ADMIN OPTION]; |
REVOKE命令取消用户角色语法:
REVOKE role_name [, role_name, ...] FROM user_name | role | PUBLIC [, user_name | role | PUBLIC, ...]; |
5、设置用户的默认角色
如果没有使用ALTER USER命令或EM进行指定,那么为某个用户授予的所有角色都被视为这个用户的默认角色。
ALTER USER username DEFAULT ROLE role [, role, ...] | ALL [EXCEPT role [, role, ...]] | NONE; |
6、启用与禁用角色
SET ROLE命令语法:
SET ROLE ALL [EXCEPT role_name [, role_name]] | NONE | role_name [IDENTIFIED BY password] [, role_name [IDENTIFIED BY password, ...]] |
如果希望为某个用户禁用一个角色,那么就需要通过再次执行SET ROLE命令或执行DBMS_SESSION.SET_ROLE过程来省略不希望用户启用的角色。
7、删除角色
为了删除角色,必须作为创建这个角色的,被授予DROP ANY ROLE系统权限的用户,或者作为使用WITH ADMIN OPTION被授予这个角色的用户。DROP ROLE命令语法:
DROP ROLE role_name; |
8、疯狂练习
一下这么多的权限、角色、用户、管理什么的。。。要搞懂看来要疯狂一把了。
$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Wed Sep 24 10:23:57 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to an idle instance. SQL> startup nomount ORACLE instance started. Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 71304908 bytes Database Buffers 188743680 bytes Redo Buffers 2973696 bytes SQL> alter database mount; Database altered. SQL> alter database open; Database altered. SQL> create user a identified by a123; User created. SQL> create user b identified by b123; User created. SQL> create role r1; Role created. SQL> grant create session to r1; Grant succeeded. SQL> grant r1 to a with admin option; Grant succeeded. SQL> conn a/a123 Connected. SQL> grant r1 to b ; Grant succeeded. SQL> conn b/b123; Connected. SQL> conn a/a123; Connected. SQL> set role r1; Role set. SQL> conn a/123; ERROR: ORA-01017: invalid username/password; logon denied Warning: You are no longer connected to ORACLE. SQL> conn / as sysdba Connected. SQL> revoke r1 from b; Revoke succeeded. SQL> revoke create session from r1; Revoke succeeded. SQL> drop role r1; Role dropped. |