2013-04-21 3 views
10

Uso lo sviluppatore SQL e ho effettuato una connessione al mio database con l'utente di sistema, dopo aver creato un utente e effettuato un'altra connessione con quell'utente con tutti i privilegi necessari.Errore SQL: tabella o vista ORA-00942 non esiste

Ma quando provo a procedere seguendo ottengo l'errore SQL

ORA-00942 table or view does not exist.:


INSERT INTO customer (c_id,name,surname) VALUES ('1','Micheal','Jackson') 

risposta

9

o l'utente non dispone di privilegi necessari per vedere la tabella, la tabella non esiste o stai eseguendo la query nello schema errato

la tabella esiste?

select owner, 
     object_name 
from dba_objects 
where object_name = any ('CUSTOMER','customer'); 

quali privilegi hai concesso?

grant select, insert on customer to user; 

stai eseguendo la query sul proprietario dalla prima query?

+4

'dba_objects' non è accessibile per un utente normale. Dovresti invece usare 'all_objects'. –

+0

Grazie mille per il vostro interesse, Ive ha eseguito la prima query per vedere il proprietario della tabella 'cliente', ho ottenuto il risultato "0 righe selezionate". quindi significa che l'utente che ho creato non ha i privilegi necessari, immagino? – user2304042

6

Non è possibile accedere direttamente alla tabella con il nome "cliente". O dovrebbe essere 'user1.customer' o creare un sinonimo 'customer' per user2 che punta a 'user1.customer'. Spero che questo aiuti ..

1

Ecco una risposta: http://www.dba-oracle.com/concepts/synonyms.htm

un sinonimo di Oracle permette in sostanza di creare un puntatore ad un oggetto che esiste da qualche altra parte. Hai bisogno di sinonimi di Oracle perché quando hai effettuato l'accesso a Oracle, cerca tutti gli oggetti che stai interrogando nel tuo schema (account). Se non ci sono, ti darà un errore che ti dice che non esistono.

10

Poiché questo post è quello più in alto su stackoverflow durante la ricerca di "ORA-00942: tabella o vista non esiste inserimento", voglio menzionare un'altra possibile causa di questo errore (almeno in Oracle 12c): a tabella utilizza una sequenza per impostare un valore predefinito e l'utente che esegue la query di inserimento non ha privilegi di selezione sulla sequenza. Questo era il mio problema e mi ci è voluto un tempo inutilmente lungo per capirlo.

Per riprodurre il problema, eseguire il seguente SQL come user1:

create sequence seq_customer_id; 

create table customer (
c_id number(10) default seq_customer_id.nextval primary key, 
name varchar(100) not null, 
surname varchar(100) not null 
); 

grant select, insert, update, delete on customer to user2; 

Poi, eseguire questa istruzione di inserimento come user2:

insert into user1.customer (name,surname) values ('michael','jackson'); 

Il risultato sarà "ORA-00942: tavolo o la vista non esiste "anche se user2 ha i privilegi di inserimento e selezione nella tabella user1.customer e ha prefisso correttamente la tabella con il nome del proprietario dello schema. Per evitare il problema, è necessario concedere il privilegio di selezione sulla sequenza:

grant select on seq_customer_id to user2; 
+0

Ho appena attraversato lo stesso scenario. Molto irritante che si ottenga 00942 quando il problema reale è un problema di autorizzazione della sequenza. – SeattleDucati