Det första steget för att diagnostisera ett problem när du skapar en vy är att prova select
del på egen hand. I det här fallet skulle du fortfarande få ORA-00942-felet, men problemet är nu bara ett fråge- och åtkomstproblem och har inte att göra med vyn specifikt.
När du får ORA-00942:tabell eller vy existerar inte , det beror på att antingen:
-
Tabell- eller vynamnet som du skrev finns verkligen inte.
-
Kontrollera stavningen - det kanske är ett stavfel.
-
Är du ansluten till en databas där den finns? Kanske är du på ett testsystem som inte har det.
-
Fråga
dba_objects
för att se om tabellen finns i ett annat schema. (Om du inte har behörighet att fråga dba_objects,all_objects
listar allt du har behörighet att se, vilket kan vara lite hjälp.)
-
-
Det finns verkligen, men det finns i ett annat schema.
I så fall finns det två möjliga problem:-
Du har inte behörighet att fråga den. Tabellens ägare måste
grant read on xyz
(ersättxyz
med det faktiska tabellnamnet ) till antingen-
du
-
public
(om du vill att alla ska kunna se uppgifterna är det inte alltid att rekommendera) -
en roll som du har (men roller används inte av lagrad PL/SQL eller vyer , dock, så det är möjligt att du kan fråga en tabell i ett annat schema tack vare en roll som du har, men ändå inte kunna skapa en vy eller en procedur som använder den.)
-
-
Du måste ange schemat. Säg att du vill fråga
REGIONS
tabell iHR
men du är ansluten somSCOTT
. Om du baraselect * from regions
den kommer att leta efterSCOTT.REGIONS
, som inte finns. För att åtgärda det, gör något av följande:-
använd
hr.regions
uttryckligen i din fråga. -
i ditt schema,
create or replace synonym regions for hr.regions;
Nu när du hänvisar tillregions
, kommer databasen automatiskt att omdirigera tillhr.regions
. -
i vilket schema som helst med behörighet att skapa offentliga synonymer:
create or replace public synonym regions for hr.regions;
Nu kommer alla som ansluter till databasen att ha några referenser tillregions
omdirigeras tillhr.regions
, vilket inte alltid är en bra idé, men det är ändå ett alternativ. -
alter session set current_schema = hr;
Nu är standardschemat för att lösa namn på objektHR
och inte den du loggat in på. För applikationer som alltid loggar in som en annan användare än den som äger tabellerna kan du skapa en efter utlösare för inloggning så detta är alltid inställt. Sedan kan de bara referera tillregions
etc utan att behöva ange något schema och utan några synonymer.
-
-