版本:
操作系统:oracle_linux_5.6_32
数据库:oracle_10.2.0.1 单实例
说明:
本实验是模拟alter user username quota 0 on tablespace_name的一个实验,证明这条语句会
发生什么事情。
模拟原因:
昨天有同学问我,当修改某一个用户在某个表空间上的磁盘份额时,会对这个用户下的一张表有
什么影响,是不能访问这个表呢、还是不能插入新行呢,又或者是不能分配新的区。于是我做了
下面实验,证明了这个结果到底是什么。
实验步骤:
(1)
首先,创建一个表空间。
SQL> create tablespace zsx datafile '/u01/app/oracle/oradata/zsx/zsx01.dbf' size 30m;
Tablespace created.
(2)
创建一个用户,使这个用户的默认表空间是zsx。
SQL> create user zsx identified by zsx account unlock default tablespace zsx;
User created.
(3)
对这个用户进行授权,只给他登陆和建表的权限,为了模拟的精确性,不建议给更高的resource或者DBA权限。
SQL> grant create session,create any table to zsx;
Grant succeeded.
(4)
给这个用户在表空间的磁盘份额,稍微给小一点,为了稍后证明另一个问题。
SQL> alter user zsx quota 5m on zsx;
User altered.
(5)
用zsx用户登陆,并创建一张表,那么现在环境就模拟好了。
[oracle@zsx ~]$ sqlplus zsx/zsx
SQL> create table zsx (id number);
Table created.
(6)
现在表创建表了,我们就去将这个zsx用户在zsx表空间上的磁盘份额修改为0.
SQL> alter user zsx quota 0 on zsx;
User altered.
(7)
证明结论1是否成立,看看到底能不能对这张表进行访问。
SQL> select * from zsx;
no rows selected
注意:
很显然是可以的,可以查询这张表,只不过我们没有数据而已,因为我们本身就没有添加数据在这张表中。
所以结论1是不成立的。
(8)
证明结论2是否成立,看看能不能向这张表中添加新的数据。
SQL> insert into zsx values(1);
1 row created.
SQL> commit;
Commit complete.
注意:
很显然是可以添加数据的,所以结论2也是不成立的。
(9)
证明结论3是否成立,看看能不能为这张表分配新的区。
SQL> alter table zsx allocate extent (size 64k);
alter table zsx allocate extent (size 64k)
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'ZSX'
注意:
这个时候结论就基本得出了,是不能为这个表再分配新的区的,报了很明显的空间配额的错误。
所以结论3是成立的。
(10)
针对结论1,其实不完全成立,说添加新数据可以,那只是在新数据较小的情况下可以,一旦
数据量过大,超过了原先分配的5m空间,那么依然会报错,如下:
SQL> begin
2 for i in 1..10000
3 loop
4 insert into zsx values(i);
5 end loop;
6 end;
7 /
begin
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'ZSX'
ORA-06512: at line 4
注意:
这时候因为5m的空间已经用完,需要重新分配新的区,所以这里一样会报错的。
综上所述:
结论3是成立的,结论2是不成立的,而结论1在数据允许的情况下是成立的。
操作系统:oracle_linux_5.6_32
数据库:oracle_10.2.0.1 单实例
说明:
本实验是模拟alter user username quota 0 on tablespace_name的一个实验,证明这条语句会
发生什么事情。
模拟原因:
昨天有同学问我,当修改某一个用户在某个表空间上的磁盘份额时,会对这个用户下的一张表有
什么影响,是不能访问这个表呢、还是不能插入新行呢,又或者是不能分配新的区。于是我做了
下面实验,证明了这个结果到底是什么。
实验步骤:
(1)
首先,创建一个表空间。
SQL> create tablespace zsx datafile '/u01/app/oracle/oradata/zsx/zsx01.dbf' size 30m;
Tablespace created.
(2)
创建一个用户,使这个用户的默认表空间是zsx。
SQL> create user zsx identified by zsx account unlock default tablespace zsx;
User created.
(3)
对这个用户进行授权,只给他登陆和建表的权限,为了模拟的精确性,不建议给更高的resource或者DBA权限。
SQL> grant create session,create any table to zsx;
Grant succeeded.
(4)
给这个用户在表空间的磁盘份额,稍微给小一点,为了稍后证明另一个问题。
SQL> alter user zsx quota 5m on zsx;
User altered.
(5)
用zsx用户登陆,并创建一张表,那么现在环境就模拟好了。
[oracle@zsx ~]$ sqlplus zsx/zsx
SQL> create table zsx (id number);
Table created.
(6)
现在表创建表了,我们就去将这个zsx用户在zsx表空间上的磁盘份额修改为0.
SQL> alter user zsx quota 0 on zsx;
User altered.
(7)
证明结论1是否成立,看看到底能不能对这张表进行访问。
SQL> select * from zsx;
no rows selected
注意:
很显然是可以的,可以查询这张表,只不过我们没有数据而已,因为我们本身就没有添加数据在这张表中。
所以结论1是不成立的。
(8)
证明结论2是否成立,看看能不能向这张表中添加新的数据。
SQL> insert into zsx values(1);
1 row created.
SQL> commit;
Commit complete.
注意:
很显然是可以添加数据的,所以结论2也是不成立的。
(9)
证明结论3是否成立,看看能不能为这张表分配新的区。
SQL> alter table zsx allocate extent (size 64k);
alter table zsx allocate extent (size 64k)
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'ZSX'
注意:
这个时候结论就基本得出了,是不能为这个表再分配新的区的,报了很明显的空间配额的错误。
所以结论3是成立的。
(10)
针对结论1,其实不完全成立,说添加新数据可以,那只是在新数据较小的情况下可以,一旦
数据量过大,超过了原先分配的5m空间,那么依然会报错,如下:
SQL> begin
2 for i in 1..10000
3 loop
4 insert into zsx values(i);
5 end loop;
6 end;
7 /
begin
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'ZSX'
ORA-06512: at line 4
注意:
这时候因为5m的空间已经用完,需要重新分配新的区,所以这里一样会报错的。
综上所述:
结论3是成立的,结论2是不成立的,而结论1在数据允许的情况下是成立的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29107230/viewspace-1062643/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29107230/viewspace-1062643/