2015-01-14 96 views
5

ho molte tabelle che posso inserire righe, ma ottengo questo errore solo per una tabella;nessun privilegio sul tablespace 'USERS'

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. 

non sono esperto di oracolo ma come ho capito dal messaggio di errore; Lo spazio tabelle 'UTENTI' è pieno e il mio utente non ha il permesso di estendere il tablespace ma le altre tabelle '(che posso inserire) tablespace' sono uguali .. qui ci sono sql's quello per la tabella inseribile e la tabella che ottiene l'errore;

nessun problema per;

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; 

errore di ricezione per;

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

Il tablespace non è pieno. L'utente non ha i diritti per * usarlo *. E il messaggio di errore dice anche cosa fare: "* Azione: ... concedere la risorsa spaziale dell'utente nello spazio tabella *" –

+0

Dice che non si dispone dell'autorizzazione per tale operazione e si dovrebbero concedere i privilegi di sistema appropriati. –

+0

come ho detto, ci sono un sacco di tabelle che posso inserire con lo stesso tablespace. se l'utente non ha i diritti d'uso, come può inserire le altre tabelle? –

risposta

1

È possibile ottenere questo effetto se l'utente ha o il ruolo RESOURCE o UNLIMITED TABLESPACE assegnato nel punto in cui sono state create le tabelle; ma da allora è stato revocato e la tabella sta ora cercando di allocare una nuova estensione. Il tuo utente non ha avuto una quota esplicitamente impostata per il tablespace; se così fosse, vedresti "ORA-01536: spazio di spazio superato per tablespace" USERS "", anche se la quota è stata successivamente rimossa impostandola su zero.

per vedere l'effetto:

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

A questo punto posso ancora inserire i dati:

insert into t42 values (2000); 

1 rows inserted. 

Ma se inserisco righe sufficiente per richiedere una seconda misura da allocare, non riesce con questo errore:

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. 

Presumibilmente il tuo DBA ha svolto alcuni controlli di privilegi, forse voking RESOURCE dal momento che è deprecato.

Come accennato nei commenti, l'amministratore del database ha la necessità di concedere un po 'di spazio sul tablespace, con una dimensione specifica o (per corrispondere a ciò che si aveva prima) nessun limite:

grant quota unlimited on users to myuser; 
+0

ho pensato che caso. ma ho provato a inserire ** una riga ** in una tabella che contiene ** più colonne ** rispetto alla tabella che dà errore. è successo ora ho provato ad inserire ** molte righe ** in una tabella ho ricevuto questo errore. sembra che tu abbia ragione Alex, congratulazioni e grazie mille. –

+0

@ AhmetSerdarÇuhadaroğlu - riceverai l'errore solo quando il tavolo che stai inserendo ha bisogno di una nuova estensione, che può essere da un inserto a riga singola. L'inserimento in un'altra tabella che ha spazio libero nelle estensioni esistenti è ancora OK. E il numero di colonne è irrilevante. –

6

tuo manuale MYUSER non ha privilegi per inserire i dati nella UTENTI tabelle. Devi dare all'utente il diritto o quota da inserire nello spazio delle tabelle degli UTENTI. È possibile farlo in diversi modi:

  1. È possibile fornire all'utente, ad es. MYUSER quota illimitata nella UTENTI tabelle:

    ALTER USER MYUSER QUOTA UNLIMITED ON USERS; 
    
  2. è anche possibile definire un massimo di spazio che l'utente è autorizzato a destinare il tablespace:

    ALTER USER MYUSER QUOTA 100M ON USERS; 
    
  3. Si può anche dare all'utente la UNLIMITED sistema tABLESPACE privilegio che significa che ha quota illimitata su qualsiasi spazio tabella all'interno del database:

    GRANT UNLIMITED TABLESPACE TO MYUSER; 
    

Per ulteriori informazioni sulla gestione delle risorse per gli utenti del database Oracle, consultare lo Oracle Database Documentation.

+0

L'utilizzo di spazi tabella (segmento) e le quote si applicano al proprietario dell'oggetto, non a chiunque stia inserendo. I limiti di risorse a cui ti sei collegato non sono per l'archiviazione. –

+0

se l'utente (MYUSER) non ha privilegi per inserire dati nello spazio tabella USERS; allora come può inserire gli altri tavoli (con lo stesso tablespace)? –

+0

Hai ragione @AlexPoole. Appena testato e si applica effettivamente al proprietario dell'oggetto non l'utente, mio ​​errore. Tuttavia, il link che ho fornito contiene anche informazioni sulle quote di tablespace sotto 'Creazione di account utente' ->' Quote spazio tabella per un utente' – gvenzl