关于ORA-1658错误和用户表空间配额
如图四川网省在导入总部导出的DMP文件中报1658错误,但是经过查询,表空间的使用率才10%,最后查明的用户空间配额给的太小造成的问题。
用户表空间配额与用户表空间是完全不一样的概念:如果对用户进行了表空间配额限制,哪怕用户就算拥有再大的表空间也只能使用被限制的那部分大小的表空间。
默认情况下用户对所有表空间都是没有配额限制的,即不受空间限制。
创建用户时指定表空间限额:
CREATE USER SG_ODS IDENTIFIED BY SG_ODS
DEFAULT TABLESPACE ODSVIEW
TEMPORARY TABLESPACE temp
QUOTA 1000M ON ODSVIEW;--执行用户的表空间配额
如何查看某用户是否有表空间限额:
在此可以使用dba_ts_quotas和use_ts_quotas来查询,select * from quotas,如果max_bytes字段是-1则代表没有表空间限额,如果有不为-1的值则代表有此值大小的表空间限额,单位是B。
说道表空间限额不得不说一下unlimited tablespace权限,该权限属于系统权限:
1.首先是一个争议,unlimited tablespace权限是否包含在resources和dba角色中,有人说是隐含在这两个角色中,有人说不包含在这两个角色中。本人认为是隐含在这两个角色中的。
2.unlimited tablespace权限可以授予用户,但是不能被授予角色。
3.unlimited tablespace权限不会随着resources和dba角色授予其他角色而被授予用户,例如我有一个角色SGOMCW,我将resources角色授予SGOMCW,然后我再把SGOMCW角色授予omcw_app用户,你会发现unlimited tablespace权限没有被授予omcw_app用户(假设omcw_app用户设定了配额)。
对于修改用户的表空间限额有三种办法。
1.alter user USERNAME quota 50M on TABLESPACENAME;
这种是对用户的表空间限额进行重新修正。
2.alter user USERNAME quota unlimited on TABLESPACENAME;
第二种是针对特定表空间来进行修正,使用户在该表空间上没有配额限制。
3.grant unlimited tablespace to USERNAME;
当授予用户该权限时,会覆盖所有单个表空间的配额,此时用户拥有了对所有表空间的无限制配额,当然也包括system和sysaux表空间,这样比较危险。
如何回收配额?
第一种和第二种的可以使用:alter user username quota 0 on tablespacename;来进行回收。
第三种可以使用 revoke unlimited tablespace from username; 来进行回收
待编辑。