sql >> Databasteknik >  >> RDS >> Oracle

ORA-00942-fel genereras när en vy skapas

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:

  1. 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.)

  2. 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ätt xyz 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 i HR men du är ansluten som SCOTT . Om du bara select * from regions den kommer att leta efter SCOTT.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 till regions , kommer databasen automatiskt att omdirigera till hr.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 till regions omdirigeras till hr.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å objekt HR 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 till regions etc utan att behöva ange något schema och utan några synonymer.



  1. När ska man använda CSV-lagringsmotorn för MySQL?

  2. Vanligt tabelluttryck i MySQL

  3. ANVÄNDA nyckelord vs ON-klausul - MYSQL

  4. Hur använder man Array/Table Parameter till Oracle (ODP.NET 10g) via ADO.NET/C#?