错误信息
【汉】ORA-01950:对表空间“XXX”没有权限
【英】ORA-01950:no privileges on tablespace 'string'
环境信息
操作系统 | 数据库版本 | 备注 |
CentOS 7 | Oracle 11G |
序
执行插入数据时报错。
故
Oracle在插入数据前,会有多项检查,其中就包括验证用户是否具有其表空间的使用额度。如果没有额度,则会抛出该错误。
Oracle有两种方式分配表空间的使用配额,分别是:
- 授予用户UNLIMITED TABLESPACE
- 分配表空间使用配额
将UNLIMITED TABLESPACE权限给到用户,则表示用户使用任何表空间没有任何限制。
而分配表空间额度,则需要指定表空间名。通常可以理解为将表空间的指定大小给到用户使用。
解
看过【故】后,我们就可以进行解决了。解决的流程还是先排查,然后再给出解决方法。
排查
首先查询TS用户具有的权限。
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE='TS';
从上图看,证明用户TS的确没有UNLIMITED TABLESPACE权限。
然后再查询当前实例下的所有表空间额度分配情况
SELECT TABLESPACE_NAME,USERNAME,BYTES,MAX_BYTES,
BLOCKS,MAX_BLOCKS,DROPPED
FROM DBA_TS_QUOTAS
从上图看,证明TS用户没有任何额度分配。
解决
排查完后,我们就可以使用两种方法来解决。
个人建议使用此方法解决。
授权解决
授权
GRANT UNLIMITED TABLESPACE TO TS;
执行授权后,再次查看会发现TS用户已经有UNLIMITED TABLESPACE权限。
分配额度解决
分配1K大小使用空间
ALTER USER TS QUOTA 1K ON TEST_DATA;
分配完后,再次查看同样会发现TS用户已经有1K的表空间使用权限。
说明:
这里显示的最大8192byte,换算成KB后就是8K。看到这里可能会有疑惑,我自己限制了1KB,为啥会分配8KB呢?其实是因为在Oracle数据库中,最小单位是块,默认的块大小是8192,所以分配时会分配最小1个块。
结
至此,ORA-01950的错就解决了。
评论区