Du ser ibland ett ora-00942-fel när du kör ett SQL-uttalande. Det har några orsaker och som vanligt är felsyntaxen inte det mest beskrivande. Om du stöter på det här och vill veta hur du åtgärdar ora-00942-felet, läs vidare.
Såvitt jag vet finns det tre huvudorsaker till ora-00942-felet:
- Otillräckliga användarbehörigheter
- Tabellen eller vyn finns faktiskt inte
- Bordet eller vyn är i ett annat schema
Jag ska visa dig hur man ska hantera var och en.
Fixa ora-00942-felet
Först av, en liten ansvarsfriskrivning. Jag är ingen DBA, jag är en Windows-administratör och skrivbords- och serverhårdvara tech. Jag vet hur man kör SQL men inte till någon grad av expertis och absolut inte till den nivå som kan felsöka problem. Jag var tvungen att fråga en Oracle DBA-kompis till min hjälp, så medan jag skrev den här biten är de smarta bitarna alla hans.
Denna lista med tre orsaker till ora-00942-felet är inte uttömmande. Det finns tydligen andra slumpmässiga orsaker till det, men dessa tre är uppenbarligen de vanligaste.
Otillräckliga användarbehörigheter
En viktig orsak till ora-00942-felet är att användaren inte har tillräckliga behörigheter 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 rollen SELECT * FROM dba_sys_privs WHERE bidragsmottagare IN (& user_role, 'PUBLIC');
- lista objekt privilegier för användaren eller rollen
SELECT bidragsmottagare, ägare || '.' || tabellnamn objekt, privilegium, beviljningsbar FRÅN dba_tab_privs VAR INNEHÅLLANDE INNEHÅLLARE (& user_role) BESTÄLL AV BYGÅENDE, ÄGARE || '.' || Tabellnamn, Privilege;
Dessa två kommer att berätta om användaren 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, bevilja dem dem eller fråga din DB Admin om att göra det.
Felet ora-00942 kan också inträffa om användaren av schemat du använder har INSERT-privilegier men inte SELECT-privilegier. Återigen, kontrollera privilegieringsnivån och lägg till VÄLJ till listan eller fråga en DB-administratör för att göra det. Tydligen måste det specifika SELECT-privilegiet beviljas varje schema annars kommer du fortfarande att se ora-00942-felet.
Tabellen eller vyn finns faktiskt inte
Denna orsak till ora-00942-felet kan orsakas av felaktigt söksyntax eller om tabellen inte existerar. Även om detta verkar vara den logiska första platsen att börja, är jag pålitligt säker på att användarrättighet är den främsta orsaken till felet. Tabellen är inte där eller fel tabellsyntax som används är andra.
För att kontrollera om tabellen finns, kolla först syntaxen för frågan. Om syntaxen är korrekt kör du den här frågan.
VÄLJ ägare, objektnamn, objekt_typ FRÅN all_objects WHERE object_type IN ('TABLE', 'VIEW') och object_name = 'YOUR_TABLE_NAME';
På den sista raden, sätt in det faktiska tabellnamnet där du ser "YOUR_TABLE_NAME". Detta borde helt klart berätta om bordet du försöker söka existerar eller inte. Om det returneras utan bord, existerar inte tabellen du frågar i schemat eller databasen.
Om det system du använder har en tabell meny kan du manuellt kontrollera för tabellen om du föredrar men ovanstående fråga får jobbet gjort.
Bordet eller vyn är i ett annat schema
Om användaren har privilegier och tabellen existerar och du fortfarande ser ora-00942-felet, är det troligt att det går 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 upp mot den är det ett enkelt fel att göra.
Kontrollera schemat manuellt om du kan eller lägg till schemanamnet i FRÅN-raden i din fråga. Om du inte har rätt behörigheter för det nya schemat ser du ora-00942-felet en gång till. Återgå till den första användarrättighetsfixen och kolla motsvarande schema eller få din DBA att göra det för dig.
Som nämnts ovan konsulterade jag en Oracle DBA-kompis till mig för det här stycket, så att han alla skulle betala för det hårda arbetet. Om du hittar några fel eller utelämningar här, är de mina ensamma. Låt mig veta i kommentarfältet om jag saknade någonting eller gjorde fel och jag kommer att rätta till det.
Om du känner till något annat sätt att åtgärda ora-00942-felet, berätta om det nedan!