【问题标题】:no privileges on tablespace 'USERS'表空间'USERS'没有权限
【发布时间】:2015-03-12 11:51:10
【问题描述】:

我有许多可以插入行的表,但我只在一个表中收到此错误;

Error starting at line 1 in command:
INSERT INTO ERRORLOG (MESSAGE) VALUES ('test')
Error report:
SQL Error: ORA-01950: no privileges on tablespace 'USERS'
01950. 00000 -  "no privileges on tablespace '%s'"
*Cause:    User does not have privileges to allocate an extent in the
           specified tablespace.
*Action:   Grant the user the appropriate system privileges or grant the user
           space resource on the tablespace.

我不是 oracle 专家,但我从错误消息中了解到; 'USERS' 表空间已满,我的用户无权扩展表空间,但其他表(我可以插入)表空间'是相同的.. 这是用于可插入表和出错表的sql;

没问题;

  CREATE TABLE "MYUSER"."HEADSHIP" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "DESCRIPTION" VARCHAR2(255 BYTE), 
    "ISDELETED" VARCHAR2(1 BYTE) DEFAULT 0 NOT NULL ENABLE, 
     CONSTRAINT "HEADSHIP_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "HEADSHIP_UI" UNIQUE ("DESCRIPTION")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;


  CREATE OR REPLACE TRIGGER "MYUSER"."HEADSHIP_TRG" BEFORE INSERT ON HEADSHIP 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF :NEW.ID IS NULL THEN
      SELECT HEADSHIP_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "MYUSER"."HEADSHIP_TRG" ENABLE;

得到错误;

CREATE TABLE "MYUSER"."ERRORLOG" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "MESSAGE" VARCHAR2(2048 BYTE), 
    "STACKTRACE" VARCHAR2(2048 BYTE), 
    "XDATE" DATE, 
    "USERLDAPNAME" VARCHAR2(127 BYTE), 
    "QUERY" VARCHAR2(2048 BYTE), 
     CONSTRAINT "ERRORLOG_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;


  CREATE OR REPLACE TRIGGER "MYUSER"."ERRORLOG_TRG" BEFORE INSERT ON ERRORLOG 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF :NEW.ID IS NULL THEN
      SELECT ERRORLOG_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/
ALTER TRIGGER "MYUSER"."ERRORLOG_TRG" ENABLE;

【问题讨论】:

  • 表空间未满。用户无权使用它。并且错误信息还告诉你该怎么做:“Action: ... grant the user space resource on the tablespace
  • 它说,您没有该操作的权限,应该授予适当的系统权限。
  • 正如我所说,我可以使用相同的表空间插入很多表。如果用户没有使用权限,如何插入其他表?
  • 我正在使用 MYUSER 与 oracle sql developer 连接。我可以在同一个查询编辑器窗口中插入其他表,但 ERRORLOG 除外。所以我想用同一个用户插入,不是吗?
  • 是的,你这样做了,正如@AlexPoole 在下面指出的那样,它实际上是无关紧要的。

标签: database oracle privileges tablespace


【解决方案1】:

您的用户 MYUSER 没有任何权限将数据插入 USERS 表空间。您必须授予用户插入 USERS 表空间的权利或配额。您可以通过几种不同的方式做到这一点:

  1. 你可以给用户,例如MYUSER USERS 表空间中的无限配额:

    ALTER USER MYUSER QUOTA UNLIMITED ON USERS;
    
  2. 您还可以定义允许用户在表空间上分配的最大空间:

    ALTER USER MYUSER QUOTA 100M ON USERS;
    
  3. 您还可以授予用户 UNLIMITED TABLESPACE 系统权限,这意味着他在数据库中的任何表空间上都拥有无限配额:

    GRANT UNLIMITED TABLESPACE TO MYUSER;
    

要获取有关 Oracle 数据库用户资源管理的更多信息,请查看Oracle Database Documentation

【讨论】:

  • 表空间(段)使用和配额适用于对象所有者,而不是插入的人。您链接到的资源限制不适用于存储。
  • 如果用户 (MYUSER) 没有任何权限将数据插入 USERS 表空间;那么它如何插入其他表(具有相同的表空间)?
  • 你是对的@AlexPoole。刚刚对其进行了测试,它确实适用于对象所有者而不是用户,我的错误。但是,我提供的链接还包含Creating User Accounts -> Tablespace Quotas for a User 下的表空间配额信息
  • thisthis...所有者似乎已经在创建表时分配了配额(具有即时初始范围),并且插入到其他表显然有效。跨度>
【解决方案2】:

如果您的用户在创建表时分配了RESOURCEUNLIMITED TABLESPACE 角色,您可以获得此效果;但这已被撤销,该表现在正试图分配一个新的范围。您的用户没有为表空间明确设置配额;如果有,那么您将看到“ORA-01536: space quota exceeded for tablespace 'USERS'”,即使随后通过将配额设置为零来删除配额也是如此。

查看效果:

-- grant unlimited tablespace to user;

create table t42 (id number) tablespace users;

Table t42 created.

insert into t42
select level as id
from dual
connect by level < 1000;

1,999 rows inserted.

select extents from user_segments where segment_name = 'T42';

   EXTENTS
----------
         1 

-- revoke unlimited tablespace from user;

此时我仍然可以插入数据:

insert into t42 values (2000);

1 rows inserted.

但如果我插入足够多的行以要求分配第二个扩展区,则会失败并出现以下错误:

insert into t42
select level + 2000 as id
from dual
connect by level < 2000;

Error report -
SQL Error: ORA-01950: no privileges on tablespace 'USERS'
01950. 00000 -  "no privileges on tablespace '%s'"
*Cause:    User does not have privileges to allocate an extent in the
           specified tablespace.
*Action:   Grant the user the appropriate system privileges or grant the user
           space resource on the tablespace.

大概您的 DBA 一直在做一些特权管理,可能会撤销 RESOURCE,因为它已被弃用。

如 cmets 中所述,您的 DBA 需要在表空间上授予您一些空间,具有特定大小或(以匹配您之前的)没有限制:

grant quota unlimited on users to myuser;

【讨论】:

  • 我认为是这种情况。但我试图将 一行 插入到包含 更多列 的表中,而不是给出错误的表。它成功了。现在我尝试将 许多行 插入到表中,但出现此错误。看来你是对的,亚历克斯,恭喜你,非常感谢你。
  • @AhmetSerdarÇuhadaroğlu - 只有当您插入的表需要新的范围时,您才会收到错误消息,该范围可以来自单行插入。插入到另一个在现有范围中有可用空间的表中仍然可以。并且列数无关紧要。
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 2021-05-06
  • 2018-05-30
  • 1970-01-01
  • 2012-07-23
  • 2015-01-04
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多