web-dev-qa-db-fra.com

pas de privilèges sur les tablespace 'USERS'

j'ai beaucoup de tables que je peux insérer des lignes, mais j'obtiens cette erreur seulement pour une table;

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.

je ne suis pas expert sur Oracle mais comme je l'ai compris d'après le message d'erreur; 'L'espace de table des utilisateurs est saturé et mon utilisateur n'est pas autorisé à étendre l'espace de table mais les autres tables' (que je peux insérer) sont identiques. obtenir une erreur;

pas de problème pour;

  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;

obtenir une erreur pour;

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;

Vous pouvez obtenir cet effet si le rôle RESOURCE ou UNLIMITED TABLESPACE a été attribué à votre utilisateur au moment de la création des tables. mais cela a depuis été révoqué, et la table tente maintenant d’attribuer une nouvelle mesure. Votre utilisateur n'a pas explicitement défini de quota pour le tablespace. dans le cas contraire, vous verriez plutôt "ORA-01536: quota d'espace dépassé pour le tablespace" UTILISATEURS "", même si le quota avait été supprimé par la suite en le mettant à zéro.

Pour voir l'effet:

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

À ce stade, je peux toujours insérer des données:

insert into t42 values (2000);

1 rows inserted.

Mais si j'insère suffisamment de lignes pour nécessiter l'allocation d'une deuxième extension, cette erreur échoue:

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.

Vraisemblablement, votre administrateur de base de données a effectué quelques tâches de gestion des privilèges, en révoquant peut-être RESOURCE car il est obsolète.

Comme mentionné dans les commentaires, votre administrateur de base de données doit vous octroyer de l'espace sur le tablespace, avec une taille spécifique ou (pour correspondre à ce que vous aviez auparavant) aucune limite:

grant quota unlimited on users to myuser;
2
Alex Poole

Votre utilisateur MYUSER ne dispose d'aucun privilège pour insérer des données dans l'espace de table USERS. Vous devez donner à l'utilisateur le droit ou le quota pour l'insérer dans le tablespace USERS. Vous pouvez le faire de différentes manières:

  1. Vous pouvez donner à l'utilisateur, par exemple MYUSER quota illimité dans l'espace de table USERS:

    ALTER USER MYUSER QUOTA UNLIMITED ON USERS;
    
  2. Vous pouvez également définir un maximum d'espace que l'utilisateur est autorisé à allouer sur le tablespace:

    ALTER USER MYUSER QUOTA 100M ON USERS;
    
  3. Vous pouvez également donner à l'utilisateur le privilège système UNLIMITED TABLESPACE, ce qui signifie qu'il dispose d'un quota illimité sur tout espace de table de la base de données:

    GRANT UNLIMITED TABLESPACE TO MYUSER;
    

Pour obtenir plus d'informations sur la gestion des ressources pour les utilisateurs de bases de données Oracle, consultez le Oracle Database Documentation .

9
gvenzl