相信大家一定对Resource 角色不会陌生,Resource 角色是授予开发人员的,能在自己的方案中创建表、序列、视图等。很多DBA习惯在创建新用户后直接赋予Connect和Resource 角色,这样就可以在数据库里执行创建表等操作了。
最近在测试过程中发现一些奇怪的现象,有时候拥有Connect和Resource 角色的用户会提示“ORA-01950: no privileges on tablespace 'USERS'”错误,也就是说没有操作表空间的权限,这是怎么回事呢?
通过一系列的测试发现,unlimited tablespace是隐含在resource角色中的一个系统权限,当用户得到resource的角色时,unlimited tablespace系统权限也隐式授权给用户。但是需要注意的是,unlimited tablespace系统权限只能授予用户,不能被授予角色;也不会随着resource角色被授予role而级联授予给用户。
首先,我们了解一下和unlimited tablespace系统权限的一个概念QUOTA,然后通过若干测试来验证以上结论。
关于QUOTA
对于一个新建的用户,如果没有分配给unlimited tablespace系统权限的用户,必须先给他们指定限额,之后他们才能在表空间中创建对象。
限额是指定标空间中允许的空间容量,默认的情况下,用户在任何表空间中都是没有限额的,可以使用以下三个选项来为用户提供表空间限额:
A、无限制的:允许用户最大限度的使用表空间中的可用空间
B、值:用户可以使用的表空间,以千字节或者兆字节为单位。但是这并不能保证会为用户保留该空间。
C、UNLIMITED TABLESPACE系统权限:此系统权限会覆盖所有的单个表空间限额,并向用户提供所有表空间(包括SYSTEM和SYSAUX)的无限制限额(注:授予resource角色的时候也会授予此权限)
如果需要为一个用户指定一个限额,可以有两种方法:
1、在创建用户的时候指定限额:
点击(此处)折叠或打开
- CREATE USER hoegh IDENTIFIED BY hoegh
- DEFAULT TABLESPACE users
- TEMPORARY TABLESPACE TEMP
- QUOTA 3M ON users;
2、在创建用户完成之后,对用户限额进行指定:
点击(此处)折叠或打开
- CREATE USER hoegh IDENTIFIED BY hoegh
- DEFAULT TABLESPACE TEST;
- ALTER USER hoegh QUOTA 3M ON users;
测试1 授予connect和resource角色
创建新用户hoegh1,授予connect和resource角色,尝试建表和插入操作,通过查询user_sys_privs数据字典来验证用户的系统权限。点击(此处)折叠或打开
- SYS@HOEGH> create user hoegh1 identified by hoegh1;
-
- User created.
-
- SYS@HOEGH>
- SYS@HOEGH> grant connect,resource to hoegh1;
-
- Grant succeeded.
-
- SYS@HOEGH> conn hoegh1/hoegh1
- Connected.
- hoegh1@HOEGH>
- hoegh1@HOEGH> create table test(id number);
-
- Table created.
-
- hoegh1@HOEGH> insert into test values(1);
-
- 1 row created.
-
- hoegh1@HOEGH>
- hoegh1@HOEGH> select privilege from user_sys_privs;
-
- PRIVILEGE
- ----------------------------------------
- UNLIMITED TABLESPACE
-
- hoegh1@HOEGH> select username,GRANTED_ROLE,ADMIN_OPTION from user_role_privs;
-
- USERNAME GRANTED_ROLE ADM
- ------------------------------ ------------------------------ ---
- HOEGH1 CONNECT NO
- HOEGH1 RESOURCE NO
-
- hoegh1@HOEGH>
测试2 逐条授予resource角色包含的系统权限
创建新用户hoegh2,授予connect并逐条授予resource角色包含的系统权限,尝试建表和插入操作,通过查 询 user_sys_privs数据字典来验证用户的系统权限。点击(此处)折叠或打开
- SYS@HOEGH> create user hoegh2 identified by hoegh2;
-
- User created.
-
- SYS@HOEGH> grant connect to hoegh2;
-
- Grant succeeded.
-
- SYS@HOEGH>
- SYS@HOEGH> select privilege from role_sys_privs
- where role='RESOURCE'; 2
-
- PRIVILEGE
- ----------------------------------------
- CREATE SEQUENCE
- CREATE TRIGGER
- CREATE CLUSTER
- CREATE PROCEDURE
- CREATE TYPE
- CREATE OPERATOR
- CREATE TABLE
- CREATE INDEXTYPE
-
- 8 rows selected.
-
- SYS@HOEGH>
- SYS@HOEGH> select 'grant '||PRIVILEGE||' to hoegh2;' from role_sys_privs
- where role='RESOURCE'; 2
-
- 'GRANT'||PRIVILEGE||'TOhoegh2;'
- -----------------------------------------------------
- grant CREATE SEQUENCE to hoegh2;
- grant CREATE TRIGGER to hoegh2;
- grant CREATE CLUSTER to hoegh2;
- grant CREATE PROCEDURE to hoegh2;
- grant CREATE TYPE to hoegh2;
- grant CREATE OPERATOR to hoegh2;
- grant CREATE TABLE to hoegh2;
- grant CREATE INDEXTYPE to hoegh2;
-
- 8 rows selected.
-
- SYS@HOEGH> grant CREATE SEQUENCE to hoegh2;
- grant CREATE TRIGGER to hoegh2;
- grant CREATE CLUSTER to hoegh2;
- grant CREATE PROCEDURE to hoegh2;
- grant CREATE TYPE to hoegh2;
- grant CREATE OPERATOR to hoegh2;
- grant CREATE TABLE to hoegh2;
- grant CREATE INDEXTYPE to hoegh2;
-
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- Grant succeeded.
-
- SYS@HOEGH>
- SYS@HOEGH>
- SYS@HOEGH> conn hoegh2/hoegh2
- Connected.
- hoegh2@HOEGH> create table test(id number);
-
- Table created.
-
- hoegh2@HOEGH> insert into test values(1);
- insert into test values(1)
- *
- ERROR at line 1:
- ORA-01950: no privileges on tablespace 'USERS'
-
-
- hoegh2@HOEGH>
- hoegh2@HOEGH>
- hoegh2@HOEGH> select privilege from user_sys_privs;
-
- PRIVILEGE
- ----------------------------------------
- CREATE TABLE
- CREATE CLUSTER
- CREATE TYPE
- CREATE TRIGGER
- CREATE PROCEDURE
- CREATE OPERATOR
- CREATE INDEXTYPE
- CREATE SEQUENCE
-
- 8 rows selected.
-
- hoegh2@HOEGH> select username,GRANTED_ROLE,ADMIN_OPTION from user_role_privs;
-
- USERNAME GRANTED_ROLE ADM
- ------------------------------ ------------------------------ ---
- HOEGH2 CONNECT NO
-
- hoegh2@HOEGH>
- hoegh2@HOEGH>
测试3 将connect和resource角色授予新的角色
创建角色hoegh,并将connect和resource角色授予这个角色;然后创建新用户hoegh3,将hoegh角色授予用户hoegh3,尝试建表和插入操作。点击(此处)折叠或打开
- SYS@HOEGH>
- SYS@HOEGH> create user hoegh3 identified by hoegh3;
-
- User created.
-
- SYS@HOEGH>
- SYS@HOEGH> create role hoegh;
-
- Role created.
-
- SYS@HOEGH> grant connect,resource to hoegh;
-
- Grant succeeded.
-
- SYS@HOEGH> grant hoegh to hoegh3;
-
- Grant succeeded.
-
- SYS@HOEGH>
- SYS@HOEGH> conn hoegh3/hoegh3
- Connected.
- hoegh3@HOEGH>
- hoegh3@HOEGH> create table test(id number);
-
- Table created.
-
- hoegh3@HOEGH> insert into test values(1);
- insert into test values(1)
- *
- ERROR at line 1:
- ORA-01950: no privileges on tablespace 'USERS'
-
-
- hoegh3@HOEGH>
- hoegh3@HOEGH> select privilege from user_sys_privs;
-
- no rows selected
-
- hoegh3@HOEGH>
- hoegh3@HOEGH> select username,GRANTED_ROLE,ADMIN_OPTION from user_role_privs;
-
- USERNAME GRANTED_ROLE ADM
- ------------------------------ ------------------------------ ---
- HOEGH3 HOEGH NO
-
- hoegh3@HOEGH>
- hoegh3@HOEGH>
测试4 直接授予用户unlimited tablespace系统权限
创建新用户hoegh4,授予connect角色后,直接授予create table和unlimited tablespace系统权限,尝试建表和插入操作。点击(此处)折叠或打开
- SYS@HOEGH> create user hoegh4 identified by hoegh4;
-
- User created.
-
- SYS@HOEGH> grant connect to hoegh4;
-
- Grant succeeded.
-
- SYS@HOEGH> grant create table to hoegh4;
-
- Grant succeeded.
-
- SYS@HOEGH> grant unlimited tablespace to hoegh4;
-
- Grant succeeded.
-
- SYS@HOEGH>
- SYS@HOEGH> conn hoegh4/hoegh4
- Connected.
- hoegh4@HOEGH>
- hoegh4@HOEGH> create table test(id number);
-
- Table created.
-
- hoegh4@HOEGH> insert into test values(1);
-
- 1 row created.
-
- hoegh4@HOEGH>
- hoegh4@HOEGH> select privilege from user_sys_privs;
-
- PRIVILEGE
- ----------------------------------------
- CREATE TABLE
- UNLIMITED TABLESPACE
-
- hoegh4@HOEGH> select username,GRANTED_ROLE,ADMIN_OPTION from user_role_privs;
-
- USERNAME GRANTED_ROLE ADM
- ------------------------------ ------------------------------ ---
- HOEGH4 CONNECT NO
-
- hoegh4@HOEGH>
- hoegh4@HOEGH>
~~~~~~~ the end~~~~~~~~~
hoegh
2016.10.26
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30162081/viewspace-2127149/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30162081/viewspace-2127149/