Ibland ser du ett ora-00942-fel när du kör ett SQL-uttalande. Det har några orsaker och som vanligt är felsyntaxen inte den mest beskrivande. Om du stöter på detta och vill veta hur du åtgärdar felet ora-00942, läs vidare.
Så vitt jag vet finns det tre huvudorsaker till felet ora-00942:
- Otillräckliga användarrättigheter
- Tabellen eller vyn finns inte
- Tabellen eller vyn finns i ett annat schema
Jag ska visa dig hur man adresserar var och en.
Fixa felet ora-00942
Till att börja med, lite ansvarsfriskrivning. Jag är ingen DBA, jag är Windows-administratör och teknik för stationär och serverhårdvara. Jag vet hur jag kör SQL men inte till någon grad av expertis och verkligen inte till den nivå som kan felsöka problem. Jag var tvungen att be en Oracle DBA-kompis av mig om hjälp, så medan jag skrev det här stycket, är de smarta bitarna hans alla.
Denna lista över tre orsaker till felet ora-00942 är inte uttömmande. Det finns uppenbarligen andra slumpmässiga orsaker till det men dessa tre är tydligen de vanligaste.
Otillräckliga användarrättigheter
En viktig orsak till felet ora-00942 är att användaren inte har tillräckliga privilegier för att komma åt tabellen i fråga. Du kan kontrollera detta genom att köra två frågor.
- lista systembehörigheter för användaren eller roll VÄLJ * FRÅN dba_sys_privs WHERE bidragsmottagare IN (& user_role, 'PUBLIC');
- lista objektbehörigheter för användaren eller rollen
VÄLJ stödmottagare, ägare || '.' || tabellnamnsobjekt, privilegium, beviljas FRÅN dba_tab_privs VAR bidragsmottagare IN (& user_role) BESTÄLLNING AV bidragsmottagare, ägare || '.' || tabellnamn, privilegium;
Dessa två berättar om användaren i fråga har rätt behörighet att köra kommandot. Om användaren har rätt behörighet, gå vidare till nästa. Om användaren inte har rätt behörighet, ge dem dem eller be din DB-administratör att göra det.
Ora-00942-felet kan också uppstå om användaren av schemat du använder har INSERT-behörigheter men inte VÄLJ privilegier. Kontrollera igen behörighetsnivån och lägg SELECT till listan eller be en DB-administratör att göra det. Uppenbarligen måste det specifika SELECT-privilegiet beviljas till varje schema, annars ser du fortfarande ora-00942-felet.
Tabellen eller vyn finns inte
Den här orsaken till felet ora-00942 kan orsakas av fel syntax för frågan eller om tabellen inte finns. Även om detta verkar vara den logiska första platsen att börja med, är jag pålitligt säker på att användarrättigheterna är den första orsaken till felet. Tabellen som inte är där eller fel tabellsyntax som används är andra.
För att kontrollera om tabellen finns, kontrollera först syntaxen för frågan. Om syntaxen är korrekt kör du den här frågan.
VÄLJ ägare, objektnamn, objektnamn FRÅN alla_objekt VAR objekt_typ IN ('TABELL', 'VISNING') OCH objekt_namn = 'YOUR_TABLE_NAME';
På den sista raden sätter du in det faktiska tabellnamnet där du ser 'YOUR_TABLE_NAME'. Detta bör definitivt berätta om tabellen du försöker fråga finns eller inte. Om den returnerar utan tabell finns inte tabellen du frågar i schemat eller databasen.
Om systemet du använder har en tabell-meny kan du manuellt leta efter tabellen om du föredrar men frågan ovan får jobbet gjort.
Tabellen eller vyn finns i ett annat schema
Om användaren har behörigheter och tabellen finns och du fortfarande ser felet ora-00942, är det troligtvis ner till schemat. Om du hanterar flera scheman är det enkelt att köra en fråga mot ett schema som inte är ditt. När du är upptagen och står emot det är det ett enkelt fel att göra.
Kontrollera schemat manuellt om du kan eller lägga till schemanamnet i FRA-raden i din fråga. Om du inte har rätt behörigheter för det nya schemat, ser du felet ora-00942 en gång till. Återgå till den första användarrättighetsfixen och kontrollera motsvarande schema eller få ditt DBA att göra det åt dig.
Som nämnts ovan konsulterade jag en Oracle DBA-kompis för mig för det här stycket så all honom till honom för det hårda arbetet. Om du hittar några fel eller utelämnanden här är de mina ensamma. Låt mig veta i kommentarsavsnittet om jag missade någonting eller fick fel och jag kommer att korrigera det.
Om du känner till något annat sätt att fixa ora-00942-felet, berätta om det nedan!