Oracle 11g R2创建分区遇ORA-01950权限问题求助
解决ORA-01950: no privileges on tablespace 'MY_TABLESPACENAME'的排查要点
我来帮你梳理下可能遗漏的环节,你已经做了常规的授权操作,但下面这些细节很容易被忽略:
确认表空间的正确性
先确保你要使用的表空间确实存在,并且拼写完全一致(Oracle对大小写敏感,如果创建表空间时用了双引号,授权和使用时也必须带双引号)。执行以下查询验证:SELECT tablespace_name FROM dba_tablespaces;如果表空间是带双引号创建的,比如
"MY_TABLESPACENAME",那授权语句要改成:ALTER USER dbadmin QUOTA 100M ON "MY_TABLESPACENAME";验证授权是否真正生效
不要想当然认为授权成功就一定生效,查询下用户的实际权限:- 查看表空间配额:
这里注意用户名要大写,Oracle默认会把用户名转为大写存储(除非创建用户时用了双引号)。SELECT tablespace_name, max_bytes FROM dba_ts_quotas WHERE username = 'DBADMIN'; - 验证UNLIMITED TABLESPACE权限:
如果查询结果为空,说明权限没真正授予,重新执行授权语句试试。SELECT privilege FROM dba_sys_privs WHERE username = 'DBADMIN' AND privilege = 'UNLIMITED TABLESPACE';
- 查看表空间配额:
检查创建表时的表空间指定
确认你创建分区表的语句中,是否明确指定了目标表空间MY_TABLESPACENAME。比如创建表的语句应该包含:CREATE TABLE your_table (...) TABLESPACE MY_TABLESPACENAME PARTITION BY ... (... TABLESPACE MY_TABLESPACENAME ...);如果你没指定表空间,Oracle会使用用户的默认表空间,先查下dbadmin的默认表空间:
SELECT default_tablespace FROM dba_users WHERE username = 'DBADMIN';如果默认表空间不是
MY_TABLESPACENAME,而你又没在创建语句中指定,那还是会用默认表空间,导致权限不足。用SYSDBA操作时的注意事项
如果你用sys用户操作,要确保是在dbadmin的 schema下创建表:- 要么先切换schema:
ALTER SESSION SET CURRENT_SCHEMA = DBADMIN; - 要么创建表时指定schema前缀:
CREATE TABLE dbadmin.your_table (...) TABLESPACE MY_TABLESPACENAME ...;
如果直接用sys创建表,表会归属sys用户,这时候要确保sys在
MY_TABLESPACENAME有足够权限(虽然sys默认有无限权限,但特殊配置下可能受限)。- 要么先切换schema:
检查表空间状态
最后确认表空间是不是处于只读状态,只读表空间无法创建表:SELECT status FROM dba_tablespaces WHERE tablespace_name = 'MY_TABLESPACENAME';如果状态是
READ ONLY,执行以下语句改为读写:ALTER TABLESPACE MY_TABLESPACENAME READ WRITE;
内容的提问来源于stack exchange,提问作者Abdel P.
相关产品推荐
相关产品推荐

