近日,研究Oracle的系统权限,发现有个比较特殊的unlimited tablespace 的权限
网上搜索到http://www.itpub.net/viewthread.php?tid=503880 上面的一些说发,
颇有些越看越迷糊的感觉。于是自己在机子上作了个实验。
首先oracle 的版本
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
确认resource 的权限
SQL> select * from role_sys_privs where role='RESOURCE';
ROLE PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
RESOURCE CREATE SEQUENCE NO
RESOURCE CREATE TRIGGER NO
RESOURCE CREATE CLUSTER NO
RESOURCE CREATE PROCEDURE NO
RESOURCE CREATE TYPE NO
RESOURCE CREATE OPERATOR NO
RESOURCE CREATE TABLE NO
RESOURCE CREATE INDEXTYPE NO
8 rows selected
由于需要连接测试,这里再加一个connect 得权限
SQL> select * from role_sys_privs where role='CONNECT';
ROLE PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
CONNECT CREATE SESSION NO
-----
----创建一个用户
create user unlimited_test identified by "123456";
先赋一个connect 得权限
grant connect to unlimited_test;
切换到unlimited_test用户
SQL> conn unlimited_test/123456@mydb
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as unlimited_test
查看一下权限
select * from user_sys_privs;
USERNAME PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
这里发现没有权限,当然create session已经给用户了,是以role connect 的方式给的,视图统计口径不一样
这个视图里面没有显示出来
切换回sys用户
把resource 赋给用户
SQL> grant resource to unlimited_test;
再切换回unlimited_test用户
查看一下权限
SQL> select * from user_sys_privs;
USERNAME PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
UNLIMITED_TEST UNLIMITED TABLESPACE NO
这里就看到unlimited tablespace 这个该死的权限了,前面可以看到resource里面
并没有这个权限,这说明在赋给resource角色的时候,oracle 自动的将unlimited tablespace 这个权限赋给
用户了。但拥有这个权限是否就像链接文章中所说的一样,‘我以SYS用户创建了一个用户,然后授予了这个用户
RESOURCE数据库预定义角色,
这个用户就可以在任意表空间中创建对象了。’
继续试验,在unlimited_test用户中
SQL> create tablespace unlimited_test datafile '/u01/app/unlimited_test.dbf' size 5m;
create tablespace unlimited_test datafile '/u01/app/unlimited_test.dbf' size 5m
ORA-01031: insufficient privilegesSQL> create table scott.test(x int ,y int);
create table scott.test(x int ,y int)
ORA-01031: insufficient privileges
可以看到根本不是这么回事。无论创建表空间还是其他用户的对象都没有权限。
这也说明了。unlimited tablespace 并不是拥有这个权限就可以“在任意表空间中创建对象了”
查看资料,根据上面的实验,得出结论
系统权限unlimited tablespace 赋给用户,并不是使得用户可以创建自己的表空间和数据文件
拥有这个功能的权限应该是create tablespace 权限,
unlimited tablespace 权限让用户可以为数据库中对应的表空间分配足够的多的物理空间。
可以这么说,unlimited tablespace 和创建对象无关,与空间的分配有关。