ORA-01536:表空间不足

本文讲解了Oracle数据库中表空间、系统表空间、限额、角色等概念,并详细介绍了如何通过设置用户默认表空间和限额来避免ORA-01536错误。同时,提供了具体的SQL命令示例。
  当用户创建表或向已有的表中插入数据时,提示Ora-01536:表空间不足。用户使用grant resource,解决问题。这不是一种好的作法,特别是在8I及以前的版本的数据中。在理解这一点之前,我们先来看以下几个概念: 

  •     表空间(tablespace)        在逻辑组成上,数据库首先是由若干个表空间组成的。用来保存用户的各种对象,包括表、索引等等。用户在建立数据库对象时,可以指定保存的目标表空间,如果没有指定,将保存至创建用户时的默认表空间。在创建用户时,管理员可以指定默认表空间,如果不批定,系统将选择系统表空间为用户的默认表空间。
  •     系统表空间(system tablespace)        保存数据库数据字典信息、PL/SQL包、过程定义、序列、同义词、视图定义等。每个数据库都必须有一个系统表空间。为了减少系统表空间碎片的发生,用户的数据不应被保存在系统表空间。           
  •     限额(quota)        就如在UNIX操作系统中可以设定用户可使用的空间限制,在ORACLE中,也可以限定用户可使用空间的最大限额。管理员可以在创建用户时用QUOTA字句进行设定,也可以创建用户可用ALTER TABLE语句修改。
  •     角色(ROLE)        用户操作数据库必须有相应的权限。角色是一组数据库权限的集合。可以用GRANT语句授予用户角色的权限。其中RESOUCE角色有点特殊,它隐含了一个叫UNLIMITED TABLESPACE的数据库系统权限。一旦用户被授予此角色,用户将可以在任何表空间创建对象,不再受限额的限止,包括系统表空间(9I中已有所改变)。
  1.  

         
    现在我们重新回到主题。当用户使用授予RESOURCE角色时,他相应地就会冒一个可能在系统表空间建立对象的风险。下面的例子将为大家揭示隐含的问题:

  Code:[Copy to clipboard]  
        
     system@test816.world>create user rudolf identified by nix
       2  /        
      
     User created.
      
     system@test816.world>grant connect to rudolf;
      
     Grant succeeded.
      
     system@test816.world>alter user rudolf quota 1M on tools;
      
     User altered.
      
     system@test816.world>connect rudolf/nix     
     Connected.     
     rudolf@test816.world>create table t (id number) storage (initial 2M) tablespace tools;
     create table t (id number) storage (initial 2M) tablespace tools
     *
     ERROR at line 1:
     ORA-01536: space quota exceeded for tablespace 'TOOLS'

很好,我们碰到了问题:

  Code:[Copy to clipboard]  

     rudolf@test816.world>connect system/alibaba
     Connected.     
     system@test816.world>
     system@test816.world>
     system@test816.world>grant resource to rudolf
       2  /
      
     Grant succeeded.
      
     system@test816.world>connect rudolf/nix
     Connected.
     rudolf@test816.world>create table t (id number) storage (initial 2M)
       2  /
      
     Table created.
      
     rudolf@test816.world>

正如所料,授予RESOURCE权限后,一切正常,可是我们的麻烦也从此开始:

  Code:[Copy to clipboard]  

     rudolf@test816.world>select tablespace_name,table_name from user_tables where table_name = 'T';
      
     TABLESPACE_NAME                TABLE_NAME
     ------------------------------ ------------------------------
     SYSTEM                         T
      
     rudolf@test816.world>

由于疏忽或其实原因,在建表时,没有加上TABLESPACE子句,直接导致对象被创建在系统表空单,而这在ORACLE中是应当绝对的被避免的。为了避免些种情况,我们建议在建立用户时请务必作用default tablespace字句与quota字句,同时,如果您要授予用户RESOURCE、DBA等隐含UNLIMITED TABLESPACE系统权限的角色时,请用REVOKE子句去掉unlimited tablespace 权限:

  Code:[Copy to clipboard]  
  
      system@test816.world>l
       1  create user rudolf
       2  identified by nix
       3  default tablespace tools           -- suggest,repace 'tools' with your own tablespace
       4  temporary tablespace temp          -- suggest
       5  quota 0 on system                  -- suggest
       6* quota unlimited on tools           -- suggest, you can have multiline such as this one, also replace 'unlimted', 'tools' as your need
     system@test816.world>/
      
     User created.
      
     system@test816.world>grant connect,resource to rudolf;
      
     Grant succeeded.
      
     system@test816.world>revoke unlimited tablespace from rudolf -- suggest
     /
      
     Revoke succeeded.        

如果用户已创建,可以:

  Code:[Copy to clipboard]  

     system@test816.world>alter user rudolf default tablespace tools
       2  quota 0 on system
       3  quota unlimited on tools        
       4  /
      
     User altered.

如果仅为解决ORA-01536错误,用户可以根据错误所示的表空间,看情况加大你的空间限额:

  Code:[Copy to clipboard]  

     rudolf@test816.world>create table t (id number) storage (initial 2M) tablespace tools;
     create table t (id number) storage (initial 2M) tablespace tools
     *
     ERROR at line 1:
     ORA-01536: space quota exceeded for tablespace 'TOOLS'

此处提示TOOLS表空间,因此:

  Code:[Copy to clipboard]  
   
       system@test816.world>alter user rudolf default tablespace tools
       2  quota 0 on system
       3  quota 10M on tools        
       4  /
      
     User altered.   
  
     system@test816.world>connect rudolf/nix
     Connected.
     rudolf@test816.world>create table t (id number) storage (initial 2M) tablespace tools
       2  /
      
     Table created.

<think>嗯,我现在遇到了ORA-01950错误,提示没有对USERS表空间的权限。我需要解决这个问题,但不太清楚具体原因。让我先回忆一下用户和表空间的关系。在Oracle中,用户创建对象时需要表空间的配额,比如表或索引。可能用户没有被分配足够的配额在USERS表空间上,导致无法创建表。 根据引用[1]和[2],这个错误通常是因为用户没有在指定表空间上的配额权限。可能我在创建用户时没有正确授予权限。比如,用户可能被创建但没有赋予在USERS表空间上的配额,或者默认表空间设置有问题。 接下来,我需要检查用户的默认表空间和配额。根据引用[4],可以查询user_users视图查看用户的默认表空间。如果默认表空间USERS,但没有配额,就会出错。所以可能需要使用ALTER USER命令分配配额,比如UNLIMITED或者具体数值。 另外,可能用户的默认表空间不是USERS,但创建对象时指定了USERS表空间,这时候同样需要在该表空间上有配额。或者,用户被授予了RESOURCE角色,但该角色可能不包括UNLIMITED TABLESPACE权限,尤其是在新版本的Oracle中。 解决方法可能包括:授予用户USERS表空间的配额,修改用户的默认表空间,或者授予UNLIMITED TABLESPACE权限。但要注意,后者可能有安全风险,应该谨慎使用。 需要验证当前用户的默认表空间和配额情况,然后根据需要调整。比如用ALTER USER ... QUOTA UNLIMITED ON USERS; 来分配配额。如果用户不需要使用USERS表空间,可以修改其默认表空间到有权限的地方。 可能还需要检查是否有表空间不足的问题,但错误提示是关于权限,所以更可能是配额问题。总之,步骤应该是检查用户设置,确认配额,然后授予必要的权限。</think>### ORA-01950 错误解决方案 #### 错误原因分析 ORA-01950 错误表明用户**缺少对表空间 `USERS` 的配额权限**,导致无法在该表空间上创建或修改对象(如表、索引等)。常见场景包括: 1. 用户创建时未分配 `USERS` 表空间的配额。 2. 用户默认表空间设置为 `USERS`,但未授予对应权限[^1][^2]。 3. 用户尝试将对象存储到 `USERS` 表空间,但未显式授权[^3]。 --- #### 解决步骤 1. **确认用户默认表空间及配额** ```sql -- 查看当前用户的默认表空间和配额 SELECT username, default_tablespace FROM user_users; -- 检查用户在所有表空间的配额 SELECT tablespace_name, max_bytes FROM dba_ts_quotas WHERE username = 'YOUR_USER'; ``` 如果 `USERS` 表空间的 `max_bytes` 为 `0` 或 `-1`(表示无限制),则需调整配额[^4]。 2. **授予用户表空间配额** ```sql -- 授予用户对 USERS 表空间的配额(例如:无限制) ALTER USER YOUR_USER QUOTA UNLIMITED ON USERS; -- 或指定具体配额大小(例如:100MB) ALTER USER YOUR_USER QUOTA 100M ON USERS; ``` 3. **修改用户默认表空间(可选)** 如果希望用户使用其他表空间: ```sql ALTER USER YOUR_USER DEFAULT TABLESPACE OTHER_TABLESPACE; ``` 4. **验证权限生效** ```sql -- 重新检查用户配额 SELECT tablespace_name, max_bytes FROM dba_ts_quotas WHERE username = 'YOUR_USER'; ``` --- #### 扩展注意事项 - **角色权限问题**:即使授予 `RESOURCE` 角色,部分 Oracle 版本仍需显式分配表空间配额[^3]。 - **表空间容量**:确保 `USERS` 表空间有足够存储空间(通过 `DBA_DATA_FILES` 检查)。 - **安全风险**:避免滥用 `UNLIMITED TABLESPACE` 权限,建议按需分配配额。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值