有关Oracle role的总结

oracle的role算是对sys privilege 和object privilege的打包。
今天深入的测试了下,还算有不少的东西。
role不是schema对象
像table等在一个schema里面不能有同名的schema object,但是可以有同名的table和role,如下。
SQL> conn test1/test1
Connected.
SQL> create role testrole;
Role created.

SQL> create table testrole as select *from all_objects;
Table created.

SQL> grant select on testrole to testrole;
Grant succeeded.

role和schema不同,有全局的意思。
--切换一个用户,把权限放进testrole里面。
SQL> conn test2/test2
Connected.

SQL> create table a as select *from obj;
Table created.

SQL> grant select on a to testrole;
Grant succeeded.

--但是话说回来,role testrole是test1用户创建的,用test2赋给其他用户的话是不允许。
SQL> grant testrole to test3;
grant testrole to test3
*
ERROR at line 1:
ORA-01919: role 'TESTROLE' does not exist

--用owner用户来赋予role testrole就没问题。
SQL> conn test1/test1
Connected.
SQL> grant testrole to test3;
Grant succeeded.

role是基于session级的

可以打开两个窗口,使用用户test1,test3来进行测试。
session1:
SQL> conn test1/test1
Connected.
SQL> create role testrole;
Role created.
session2:
SQL> conn test3/test3
Connected.
session1:

SQL> grant select on t1 to testrole;
Grant succeeded.
SQL> grant select on testrole to test3;
Grant succeeded.

session2:

SQL> desc test1.t1
ERROR:
ORA-04043: object test1.t1 does not exist
session2 再次登录:
SQL> conn test3/test3
Connected.
SQL> desc test1.t1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(19)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)
还有一点需要说明一下,如果直接赋予object privilege,在当前session就会生效,这也是和role的一个不同之处。

当前session激活role
可以使用set role或者dbms_session.set_role来激活。

role的限制
   --> 在pl/sql中的限制

在动态sql中,如果调用某些表的时候,通过role,会有table or view not found这类的exception, 这时候需要通过直接赋予object privilege来修正。

    -->创建视图时的问题

创建视图时,很可能会有insuffisicant privilege的错误。可以参见http://space.itpub.net/23718752/viewspace-762805/

role的加密
如果10个人用同一个db 账号,但是每个人又需要有不同的权限,可以对role加密。
这样每个人在使用的时候都能够相应的通过密码来激活属于自己的role。

SQL> create role user1_role identified by test1;
Role created.

SQL> create role user2_role identified by test2;
Role created.

SQL> create role user3_role identified by test3;
Role created.

SQL> create table t1 as select *from obj;
Table created.

SQL> create table t2 as select *from tab;
Table created.

SQL> create table t3 as select *from syn;
Table created.

SQL> grant select on t1 to user1_role;
Grant succeeded.

SQL> grant select on t2 to user2_role;
Grant succeeded.

SQL> grant select on t3 to user3_role;
Grant succeeded.

SQL> grant user1_role,user2_role,user3_role to test3;
Grant succeeded.

---初始化test3
SQL> conn / as sysdba
Connected.
--一下这句很关键,只指定用户test3有connect的角色
SQL> alter user test3 default role connect;
User altered.

--使用test3来连入,
SQL> conn test3/test3
Connected.
SQL> select *from session_roles;
ROLE
------------------------------
CONNECT

--先查看是否可以访问test1.t1
SQL> desc test1.t1
ERROR:
ORA-04043: object test1.t1 does not exist

--尝试无密码直接激活role user1_role
SQL> set role user1_role ;
set role user1_role
*
ERROR at line 1:
ORA-01979: missing or invalid password for role 'USER1_ROLE'

--使用密码激活role user1_role
SQL> set role user1_role identified by test1;
Role set.

SQL> select *from session_roles;
ROLE
------------------------------
USER1_ROLE

SQL> desc test1.t1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(19)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)

使用另外一个session,使用同样的账号test3
 
SQL> conn test3/test3
Connected.
 
SQL> select *from session_roles;
ROLE
------------------------------
CONNECT

SQL> set role user2_role identified by test2;
Role set.

SQL> desc test1.t2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TNAME                                     NOT NULL VARCHAR2(30)
 TABTYPE                                            VARCHAR2(7)
 CLUSTERID                                          NUMBER



secure application role
关于secure applicaton role可以是对role的高级使用,比如你可以限制某些Ip的机器才能激活某些权限。某些特定条件的用户才能激活某些权限,甚至指定在每天的每个时间段才能激活某些权限。这些复杂的需求直接通过external role,dbms_session.set_role, set role等操作就不能实现,需要更细粒度的控制。
下面就举一个例子,来让指定的用户才能激活某些权限。
SQL> select *from all_users;
USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
DIP                                    20 06-NOV-13
TSMSYS                                 22 06-NOV-13
TEST1                                  26 07-NOV-13
TEST2                                  30 10-NOV-13
DBSNMP                                 25 07-NOV-13
SYS                                     0 06-NOV-13
SYSTEM                                  5 06-NOV-13
OUTLN                                  11 06-NOV-13
8 rows selected.

test1下有个表mv_test, 只能通过用户test2才能访问。
(注意:要实现这个需求,如果对于dba账户来说没有任何限制,因为dba账户本来就可以访问test1.mv_test)
步骤如下:
创建role,指定通过内嵌dbms_session.set_role的包来激活
SQL> conn test1/test1
Connected.
SQL> create role r1 identified using test1.setroles;
Role created.
SQL> grant select on test1.mv_test to r1;
Grant succeeded
SQL> grant r1 to test2;
Grant succeeded.
--注意一定要制定authid current_user
SQL> create or replace package setroles authid current_user as 
  2  procedure setrole;
  3  end;
  4  /
Package created.

--创建包体
SQL> create or replace package body setroles as 
  2  procedure setrole as
  3  begin
  4  if(sys_context('USERENV','current_user')='TEST2') then
  5  dbms_session.set_role('R1');
  6  end if;
  7  end;
  8  end;
  9  /
--如果可以,可以把运行这个包的权限开放,但是只有合适的用户才能激活。

SQL> grant execute on test1.setroles to public;

--用测试用户连入
SQL> conn test2/test2
Connected.
--查看当前持有的role
SQL> select *from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE

SQL> desc test1.mv_test
ERROR:
ORA-04043: object test1.mv_test does not exist

--运行指定的包以后,来验证
SQL> exec test1.setroles.setrole;
PL/SQL procedure successfully completed.

SQL> select *from session_roles;
ROLE
------------------------------
R1

SQL> desc test1.mv_test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OBJECT_ID                                 NOT NULL NUMBER
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 CREATED                                   NOT NULL DATE

选择另外一个用户来比较
--新创建一个用户。

SQL> conn / as sysdba
Connected.
SQL> create user test3 identified by test3;
User created.

SQL> grant connect,resource to test3;
Grant succeeded.

SQL> conn test3/test3
Connected.
SQL> select *from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE

SQL> desc test1.mv_test
ERROR:
ORA-04043: object test1.mv_test does not exist
--运行指定的包,来验证。
SQL> exec test1.setroles.setrole;
PL/SQL procedure successfully completed.

SQL> select *from session_roles;
ROLE
------------------------------
CONNECT
RESOURCE

SQL> desc test1.mv_test
ERROR:
ORA-04043: object test1.mv_test does not exist

还有像external role,global之类的role可能使用不是很广泛,先说到这。后面后加以补充。

时间: 2024-09-20 05:48:45

有关Oracle role的总结的相关文章

Oracle ROLE如何启用个数限制

Oracle在启用用户的角色时,最多允许启用148个. 其实这个限制比较奇怪,因为148与2的幂相差较大,不知道Oracle出于什么原因确定的这个值: SQL> CREATE USER U_ROLE IDENTIFIED BY U_PASSWORD; 用户已创建. SQL> GRANT CREATE ROLE TO U_ROLE; 授权成功. SQL> GRANT CREATE SESSION TO U_ROLE; 授权成功. SQL> CONN U_ROLE/U_PASSWORD

oracle数据库用户角色简单测试

测试数据库角色role,使用set role命令启用角色,设置数据库用户的缺省角色 创建角r1和r2,其中r2通过口令验证,我设置的口令是oracle SQL> conn system/oracle Connected. SQL> create role r1; Role created. SQL> create role r2 identified by oracle; Role created. 给这两个角色授权,其中r2的权限包含r1的权限,也就是说r2的权限高一些 SQL>

Oracle 角色、配置文件

--================================ --Oracle 角色.配置文件 --================================   一.角色     1.角色            权限的集合,可以分配给一个用户或其他角色,但角色不能授予自己,也不能循环授予        角色的优点            可以先创建角色,向该角色赋予一系列权限,然后再将该角色授予多个用户或角色            增加或删除角色中的某一权限,被授予该角色的所有用户

如何在Oracle存储过程中拥有role权限

我们知道,用户拥有的role权限在存储过程是不可用的.如: SQL> select * from dba_role_privs where grantee='SUK'; GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE------------ ------------SUK DBA NO YESSUK CONNECT NO YESSUK RESOURCE NO YES 用户SUK拥有DBA这个role 再创建一个测试存储过程: create or re

[20151110]oracle可以启用多少role.txt

[20151110]oracle可以启用多少role.txt --链接http://blog.itpub.net/4227/viewspace-676078/ Oracle在启用用户的角色时,最多允许启用148个. 其实这个限制比较奇怪,因为148与2的幂相差较大,不知道Oracle出于什么原因确定的这个值: BEGIN FOR I IN 1..148 LOOP EXECUTE IMMEDIATE 'CREATE ROLE R_' || I; END LOOP; END; / CREATE RO

Oracle角色权限之Default Role

Oracle角色权限之Default Role  Oracle系统权限基础是建立在三个维度层面上,即系统权限(System Privilege).对象权限(Object Privilege)和角色权限(Role Privilege).系统权限定义了用户可以执行的某些行为操作:对象权限定义了用户在某个系统对象(如数据表.视图等)的操作权限:角色权限更像是一个容器对象,可以将一组系统权限.对象权限甚至其他角色权限容纳到其中. 三个维度权限在三个层面上构建了Oracle权限体系框架.传统应用系统的一种

将 Oracle 内置的安全特性用于 PHP

当今大多数 Web 应用程序都需要至少采用某种基本的安全策略.例如,提供用口令保护的内容的网站.仅具有管理员后端的网站.网志和个人杂志.电子商务网站.企业内联网,等等. 构建这些类型的 Web 应用程序最常用的设计方法是将安全策略整合到 Web 应用程序的业务逻辑中,即由应用程序决定某个用户是否有权访问数据库中的某个数据.在这种情形下,数据库的角色仅为存储数据和依请求提供数据.换句话说,如果 Web 应用程序命令数据库提供特定信息,则数据库会直接执行该命令而不检查用户的权限. 在该文中,您将学习

将Oracle内置的安全特性用于php

当今大多数 Web 应用程序都需要至少采用某种基本的安全策略.例如,提供用口令保护的内容的网站.仅具有管理员后端的网站.网志和个人杂志.电子商务网站.企业内联网,等等. 构建这些类型的 Web 应用程序最常用的设计方法是将安全策略整合到 Web 应用程序的业务逻辑中,即由应用程序决定某个用户是否有权访问数据库中的某个数据.在这种情形下,数据库的角色仅为存储数据和依请求提供数据.换句话说,如果 Web 应用程序命令数据库提供特定信息,则数据库会直接执行该命令而不检查用户的权限. 在该文中,您将学习

将Oracle 10g内置的安全特性用于PHP

当今大多数 Web 应用程序都需要至少采用某种基本的安全策略.例如,提供用口令保护的内容的网站.仅具有管理员后端的网站.网志和个人杂志.电子商务网站.企业内联网,等等. 构建这些类型的 Web 应用程序最常用的设计方法是将安全策略整合到 Web 应用程序的业务逻辑中,即由应用程序决定某个用户是否有权访问数据库中的某个数据.在这种情形下,数据库的角色仅为存储数据和依请求提供数据.换句话说,如果 Web 应用程序命令数据库提供特定信息,则数据库会直接执行该命令而不检查用户的权限. 在该文中,您将学习