Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'erreur ORA-00942 est générée lors de la création d'une vue

La première étape du diagnostic d'un problème lors de la création d'une vue consiste à essayer la commande select partie à elle seule. Dans ce cas, vous obtiendrez toujours l'erreur ORA-00942, mais le problème n'est plus qu'un problème de requête et d'accès et ne concerne pas spécifiquement la vue.

Lorsque vous obtenez ORA-00942 :la table ou la vue n'existe pas , c'est parce que :

  1. Le nom de la table ou de la vue que vous avez tapé n'existe pas vraiment.

    • Vérifiez l'orthographe - il y a peut-être une faute de frappe.

    • Êtes-vous connecté à une base de données là où elle existe ? Vous êtes peut-être sur un système de test qui ne l'a pas.

    • Requête dba_objects pour voir si la table existe dans un autre schéma. (Si vous n'avez pas les privilèges pour interroger dba_objects, all_objects répertorie tout ce que vous êtes autorisé à afficher, ce qui peut être utile.)

  2. Cela existe vraiment, mais c'est dans un autre schéma.
    Dans ce cas, il y a deux problèmes possibles :

    • Vous n'êtes pas autorisé à l'interroger. Le propriétaire de la table doit grant read on xyz (remplacez le nom réel de la table par xyz ) soit

      • vous

      • public (si vous voulez que tout le monde puisse voir les données, ce n'est pas toujours conseillé)

      • un rôle que vous avez (mais les rôles ne sont pas utilisés par le PL/SQL stocké ou vues , cependant, il est donc possible que vous puissiez interroger une table dans un autre schéma grâce à un rôle que vous avez, mais que vous ne puissiez toujours pas créer une vue ou une procédure qui l'utilise.)

    • Vous devez spécifier le schéma. Supposons que vous souhaitiez interroger les REGIONS table en HR mais vous êtes connecté en tant que SCOTT . Si vous ne faites que select * from regions il recherchera SCOTT.REGIONS , qui n'existe pas. Pour résoudre ce problème, effectuez l'une des actions suivantes :

      • utilisez hr.regions explicitement dans votre requête.

      • dans votre schéma, create or replace synonym regions for hr.regions;
        Maintenant, chaque fois que vous faites référence à des regions , la base de données redirigera automatiquement vers hr.regions .

      • dans n'importe quel schéma avec l'autorisation de créer des synonymes publics :
        create or replace public synonym regions for hr.regions;
        Désormais, toute personne se connectant à la base de données aura des références aux regions redirigé vers hr.regions , ce qui n'est pas toujours une bonne idée, mais c'est quand même une option.

      • alter session set current_schema = hr;
        Désormais, le schéma par défaut pour résoudre les noms d'objets est HR et non celui auquel vous vous êtes connecté. Pour les applications qui se connectent toujours en tant qu'utilisateur différent de celui qui possède les tables, vous pouvez créer un après le déclencheur de connexion donc c'est toujours réglé. Ensuite, ils peuvent simplement se référer aux regions etc sans avoir besoin de spécifier de schéma et sans synonymes.