De eerste stap bij het diagnosticeren van een probleem bij het maken van een weergave is om de select
. te proberen deel op zich. In dit geval zou u nog steeds de ORA-00942-fout krijgen, maar het probleem is nu slechts een vraag- en toegangsprobleem en heeft niet specifiek te maken met de weergave.
Wanneer u ORA-00942:tabel of weergave niet bestaat . krijgt , het is omdat ofwel:
-
De tabel- of weergavenaam die je hebt getypt, bestaat echt niet.
-
Controleer de spelling - misschien is er een typefout.
-
Bent u verbonden met een database waar deze bestaat? Misschien zit u op een testsysteem dat dit niet heeft.
-
Zoekopdracht
dba_objects
om te zien of de tabel in een ander schema bestaat. (Als u geen rechten heeft om dba_objects te doorzoeken,all_objects
geeft alles weer waarvoor je toestemming hebt om te bekijken, wat misschien wat hulp kan bieden.)
-
-
Het bestaat echt, maar het staat in een ander schema.
In dat geval zijn er twee mogelijke problemen:-
U heeft geen toestemming om het op te vragen. De eigenaar van de tabel moet
grant read on xyz
(vervang de werkelijke tabelnaam doorxyz
) naar een van beide-
jij
-
public
(als je wilt dat iedereen de gegevens kan zien, is dat niet altijd aan te raden) -
een rol die je hebt (maar rollen worden niet gebruikt door opgeslagen PL/SQL of weergaven , het is echter mogelijk dat u een query kunt uitvoeren op een tabel in een ander schema dankzij een rol die u heeft, maar nog steeds geen weergave of procedure kunt maken die deze gebruikt.)
-
-
U moet het schema opgeven. Stel dat u de
REGIONS
. wilt opvragen tabel inHR
maar je bent verbonden alsSCOTT
. Als je gewoonselect * from regions
het zoekt naarSCOTT.REGIONS
, die niet bestaat. Voer een van de volgende handelingen uit om dit op te lossen:-
gebruik
hr.regions
expliciet in uw vraag. -
create or replace synonym regions for hr.regions;
Nu wanneer u verwijst naarregions
, zal de database automatisch doorverwijzen naarhr.regions
. -
in elk schema met toestemming om openbare synoniemen te maken:
create or replace public synonym regions for hr.regions;
Nu heeft iedereen die verbinding maakt met de database verwijzingen naarregions
doorgestuurd naarhr.regions
, wat niet altijd een goed idee is, maar het is sowieso een optie. -
alter session set current_schema = hr;
Het standaardschema voor het oplossen van namen van objecten is nuHR
en niet degene waarmee je bent ingelogd. Voor toepassingen die altijd inloggen als een andere gebruiker dan degene die de tabellen bezit, kunt u een na aanmeldingstrigger dus dit is altijd ingesteld. Dan kunnen ze gewoon verwijzen naarregions
enz. zonder een schema op te geven en zonder synoniemen.
-
-