Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-00942-Fehler wird beim Erstellen einer Ansicht generiert

Der erste Schritt bei der Diagnose eines Problems beim Erstellen einer Ansicht besteht darin, select auszuprobieren Teil für sich. In diesem Fall würden Sie immer noch den Fehler ORA-00942 erhalten, aber das Problem ist jetzt nur noch ein Abfrage- und Zugriffsproblem und hat nichts mit der Ansicht zu tun.

Wenn Sie ORA-00942:Tabelle oder Ansicht existiert nicht erhalten , weil entweder:

  1. Der von Ihnen eingegebene Tabellen- oder Ansichtsname existiert wirklich nicht.

    • Überprüfen Sie die Rechtschreibung - vielleicht liegt ein Tippfehler vor.

    • Sind Sie mit einer Datenbank verbunden, wo es existiert? Vielleicht sind Sie auf einem Testsystem, das es nicht hat.

    • Fragen Sie dba_objects ab um zu sehen, ob die Tabelle in einem anderen Schema vorhanden ist. (Wenn Sie keine Berechtigungen zum Abfragen von dba_objects, all_objects listet alles auf, zu dessen Anzeige Sie berechtigt sind, was hilfreich sein kann.)

  2. Es existiert wirklich, aber es ist in einem anderen Schema.
    In diesem Fall gibt es zwei mögliche Probleme:

    • Sie sind nicht berechtigt, sie abzufragen. Der Eigentümer der Tabelle muss grant read on xyz (Ersetzen Sie xyz durch den tatsächlichen Tabellennamen ) entweder

      • du

      • public (wenn Sie möchten, dass jeder die Daten sehen kann, nicht immer ratsam)

      • eine Rolle die Sie haben (aber Rollen werden nicht von gespeichertem PL/SQL oder Ansichten , daher ist es möglich, dass Sie dank einer Rolle, die Sie haben, eine Tabelle in einem anderen Schema abfragen können, aber dennoch keine Ansicht oder Prozedur erstellen können, die sie verwendet.)

    • Sie müssen das Schema angeben. Angenommen, Sie möchten die REGIONS abfragen Tabelle in HR aber Sie sind als SCOTT verbunden . Wenn Sie einfach select * from regions es wird nach SCOTT.REGIONS gesucht , die es nicht gibt. Führen Sie einen der folgenden Schritte aus, um dies zu beheben:

      • Verwenden Sie hr.regions ausdrücklich in Ihrer Abfrage.

      • create or replace synonym regions for hr.regions;
        Jetzt immer, wenn Sie sich auf regions beziehen , leitet die Datenbank automatisch zu hr.regions um .

      • in jedem Schema mit der Berechtigung zum Erstellen öffentlicher Synonyme:
        create or replace public synonym regions for hr.regions;
        Jetzt hat jeder, der sich mit der Datenbank verbindet, Verweise auf regions umgeleitet zu hr.regions , was nicht immer eine gute Idee ist, aber es ist trotzdem eine Option.

      • alter session set current_schema = hr;
        Jetzt ist das Standardschema zum Auflösen von Objektnamen HR und nicht die, bei der Sie sich angemeldet haben. Für Anwendungen, die sich immer als ein anderer Benutzer anmelden als der, dem die Tabellen gehören, können Sie einen nach dem Logon-Trigger das ist also immer gesetzt. Dann können sie sich einfach auf regions beziehen usw., ohne ein Schema angeben zu müssen und ohne Synonyme.