resource角色对quota表空间限额的影响
2015-01-27 10:53
330 查看
前两天,看到论坛中有位兄弟说设置了用户对表空间的quota限额,但仍可以插入超过限额大小的数据量到表空间。
也是觉得很奇怪,那quota起什么作用?
用实验来说明:
1. 创建用户
SQL> create user res_user identified by user_123
default tablespace dcsopen_tbspace
quota 500K on dcsopen_tbspace;
grant create session, create table to res_user;
限定res_user用户在dcsopen_tbspace表空间中只能使用500K的容量。
2. 使用res_user账户登录
SQL> select * from user_ts_quotas;
TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
DCSOPEN_TBSPACE 0 516096 0 63 NO
查看该用户可用最大容量为516096字节,大约500K。
3. 测试表空间可用容量
SQL> create table t as select * from all_objects where 1<>1;
创建一张表结构,用于测试。
SQL> insert into t select * from all_objects;
insert into t select * from all_objects
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'DCSOPEN_TBSPACE'
向其中插入数据,报错ORA-01536: space quota exceeded for tablespace 'DCSOPEN_TBSPACE',提示用户当前使用容量已超过对表空间的限额值因此拒绝执行插入。
4. 为用户授予resource权限
SQL> grant resource to res_user;
SQL> insert into t select * from all_objects;
未提示错误。
SQL> select * from user_ts_quotas;
TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
DCSOPEN_TBSPACE 5242880 516096 640 63 NO
发现容量早已超过MAX_BYTES值。
查询此时用户拥有的角色:
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
RES_USER RESOURCE NO YES NO
查询此时用户的系统权限:
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
RES_USER CREATE SESSION NO
RES_USER UNLIMITED TABLESPACE NO
RES_USER CREATE TABLE NO
用户具有了UNLIMITED TABLESPACE的权限,即对表空间没有限额。
为了验证这点,可以revoke resource from res_user,再查询user_sys_privs,发现确实UNLIMITED
TABLESPACE权限是跟随RESOURCE角色的。
5. 可以不授予resource,但仍让用户具有无限容量权限
SQL> alter user
res_user quota unlimited on dcsopen_tbspace;
SQL> select * from
user_ts_quotas;
TABLESPACE_NAME
BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
DCSOPEN_TBSPACE 5242880 -1 640 -1 NO
-1表示无上限。
结论:
1. 可以为用户指定使用某个表空间的限额,当使用容量超过限额,会提示错误。限额值可以用user_ts_quotas表查询。
2. 若为用户授予resource角色,则用户自动具有UNLIMITED TABLESPACE权限,即使用quota限额,也不受其控制。
也是觉得很奇怪,那quota起什么作用?
用实验来说明:
1. 创建用户
SQL> create user res_user identified by user_123
default tablespace dcsopen_tbspace
quota 500K on dcsopen_tbspace;
grant create session, create table to res_user;
限定res_user用户在dcsopen_tbspace表空间中只能使用500K的容量。
2. 使用res_user账户登录
SQL> select * from user_ts_quotas;
TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
DCSOPEN_TBSPACE 0 516096 0 63 NO
查看该用户可用最大容量为516096字节,大约500K。
3. 测试表空间可用容量
SQL> create table t as select * from all_objects where 1<>1;
创建一张表结构,用于测试。
SQL> insert into t select * from all_objects;
insert into t select * from all_objects
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'DCSOPEN_TBSPACE'
向其中插入数据,报错ORA-01536: space quota exceeded for tablespace 'DCSOPEN_TBSPACE',提示用户当前使用容量已超过对表空间的限额值因此拒绝执行插入。
4. 为用户授予resource权限
SQL> grant resource to res_user;
SQL> insert into t select * from all_objects;
未提示错误。
SQL> select * from user_ts_quotas;
TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
DCSOPEN_TBSPACE 5242880 516096 640 63 NO
发现容量早已超过MAX_BYTES值。
查询此时用户拥有的角色:
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
RES_USER RESOURCE NO YES NO
查询此时用户的系统权限:
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
RES_USER CREATE SESSION NO
RES_USER UNLIMITED TABLESPACE NO
RES_USER CREATE TABLE NO
用户具有了UNLIMITED TABLESPACE的权限,即对表空间没有限额。
为了验证这点,可以revoke resource from res_user,再查询user_sys_privs,发现确实UNLIMITED
TABLESPACE权限是跟随RESOURCE角色的。
5. 可以不授予resource,但仍让用户具有无限容量权限
SQL> alter user
res_user quota unlimited on dcsopen_tbspace;
SQL> select * from
user_ts_quotas;
TABLESPACE_NAME
BYTES MAX_BYTES BLOCKS MAX_BLOCKS DRO
------------------------------ ---------- ---------- ---------- ---------- ---
DCSOPEN_TBSPACE 5242880 -1 640 -1 NO
-1表示无上限。
结论:
1. 可以为用户指定使用某个表空间的限额,当使用容量超过限额,会提示错误。限额值可以用user_ts_quotas表查询。
2. 若为用户授予resource角色,则用户自动具有UNLIMITED TABLESPACE权限,即使用quota限额,也不受其控制。
相关文章推荐
- quota设置用户磁盘空间限额
- 用户表空间限额(Oracle User Space Quota )
- Oracle DB 关于CONNECT、RESOURCE 和DBA 角色权限
- PostgreSQL数据库、表空间、角色及用户
- 机器人学影响 CIO 角色的 3 种方式
- Oracle创建删除用户、角色、表空间、导入导出、...命令总结
- Script:收集数据库中用户的角色和表空间等信息
- Oracle新建用户、角色,授权,建表空间
- quota命令_Linux quota 命令用法详解:显示磁盘已使用的空间与限制
- [Unity&网格移动]NavMeshAgent寻路 怎么样使得角色移动的角速度不影响移动
- connect、resource和dba三种标准角色
- ASM时的OFM特性对影的建数据文件名的影响及为SYSTEM表空间的数据文件使用别名
- 相同更改数据量的前提下,单次COMMIT和多次COMMIT对日志空间浪费的影响对比
- Oracle新建用户、角色,授权,建表空间
- connect、resource和dba三种标准角色
- Oracle数据库如何查看当前用户角色权限及默认表空间
- connect、resource和dba三种标准角色
- 重建控制文件对临时表空间及只读表空间的影响
- ORA-01536: 超出表空间 'XX' 的空间限额
- 倪蒙oralce学习笔记之Oracle创建删除用户、角色、表空间、导入导出数据库总结