нет привилегий для табличного пространства "ПОЛЬЗОВАТЕЛИ"

у меня много таблиц, в которые я могу вставлять строки, но я получаю эту ошибку только для одной таблицы;

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;

person Ahmet Serdar Çuhadaroğlu    schedule 14.01.2015    source источник
comment
Табличное пространство не заполнено. У пользователя нет прав на его использование. И сообщение об ошибке также сообщает вам, что делать: Действие: ... предоставить ресурс пользовательского пространства в табличном пространстве   -  person a_horse_with_no_name    schedule 14.01.2015
comment
В нем говорится, что у вас нет разрешения на эту операцию, и вам следует предоставить соответствующие системные привилегии.   -  person Oğuz Sezer    schedule 14.01.2015
comment
как я уже сказал, есть много таблиц, которые я могу вставить с тем же табличным пространством. если у пользователя нет прав на использование, как он может вставлять другие таблицы?   -  person Ahmet Serdar Çuhadaroğlu    schedule 14.01.2015
comment
Я подключаюсь к разработчику Oracle sql с помощью MYUSER. Я могу вставить другие таблицы, но ERRORLOG в то же окно редактора запросов. Итак, я пытаюсь вставить с тем же пользователем, не так ли?   -  person Ahmet Serdar Çuhadaroğlu    schedule 14.01.2015
comment
Да, вы это делаете, и, как @AlexPoole указал ниже, это в любом случае не имеет значения.   -  person gvenzl    schedule 14.01.2015


Ответы (2)


Вы можете получить этот эффект, если бы вашему пользователю была назначена роль RESOURCE или UNLIMITED TABLESPACE в момент создания таблиц; но с тех пор это было отменено, и теперь таблица пытается выделить новый экстент. У вашего пользователя не была явно установлена ​​квота для табличного пространства; если бы это было так, вы бы вместо этого увидели «ORA-01536: превышена квота пространства для табличного пространства« ПОЛЬЗОВАТЕЛИ »», даже если квота впоследствии была удалена путем установки ее на ноль.

Чтобы увидеть эффект:

-- 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.

Предположительно, ваш администратор баз данных выполнял некоторые операции по обслуживанию привилегий, возможно, отменив RESOURCE, поскольку он устарел.

Как упоминалось в комментариях, ваш администратор базы данных должен предоставить вам некоторое пространство в табличном пространстве с определенным размером или (чтобы соответствовать тому, что у вас было раньше) без ограничений:

grant quota unlimited on users to myuser;
person Alex Poole    schedule 14.01.2015
comment
я думал об этом случае. но я попытался вставить одну строку в таблицу, которая содержит больше столбцов, чем таблица, дающая ошибку. это удалось. теперь я попытался вставить много строк в таблицу, я получил эту ошибку. Кажется, ты прав, Алекс, поздравляю и большое тебе спасибо. - person Ahmet Serdar Çuhadaroğlu; 15.01.2015
comment
@ AhmetSerdarÇuhadaroğlu - вы получите сообщение об ошибке только тогда, когда таблица, в которую вы вставляете, нуждается в новом экстенте, который может быть из однострочной вставки. Вставка в другую таблицу, в которой есть свободное место в существующих экстентах, все еще в порядке. И количество столбцов значения не имеет. - person Alex Poole; 15.01.2015

У вашего пользователя 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 Database, ознакомьтесь с Oracle Документация по базе данных.

person gvenzl    schedule 14.01.2015
comment
Использование табличного пространства (сегмента) и квоты применяются к владельцу объекта, а не к тому, кто его вставляет. Ограничения ресурсов, с которыми вы связались, не предназначены для хранения. - person Alex Poole; 14.01.2015
comment
если у пользователя (MYUSER) нет прав на вставку данных в табличное пространство USERS; тогда как он может вставлять другие таблицы (с тем же табличным пространством)? - person Ahmet Serdar Çuhadaroğlu; 14.01.2015
comment
Вы правы, @AlexPoole. Просто протестировал его, и это действительно относится к владельцу объекта, а не к пользователю, моя ошибка. Однако приведенная мною ссылка также содержит информацию о квотах табличных пространств в Creating User Accounts - ›Tablespace Quotas for a User - person gvenzl; 14.01.2015
comment
См. this и this ... Похоже, что владельцу уже назначена квота поскольку таблица была создана (с немедленным начальным размером), и вставки в другие таблицы, по-видимому, работают. - person Alex Poole; 14.01.2015