IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

ORA-00942 lors de la création d'un trigger


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 80
    Points : 47
    Points
    47
    Par défaut ORA-00942 lors de la création d'un trigger
    Bonjour à tous,
    j'ai une grande interrogation : j'ai le trigger suivant que j'encapsule avec plusieurs autres requêtes SQL pour me faciliter les migrations. (je n'indique que le trigger)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    create or replace
    TRIGGER MonSchema.TB_REPORT_FAV_TRG
    BEFORE INSERT
    ON TB_REPORT_FAV
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    WHEN (
    	(NEW.REPORT_FAV_SN IS NULL) OR
    	(NEW.REPORT_FAV_SN =0)
          )
    DECLARE
    BEGIN
       SELECT SEQ_TB_REPORT_FAV.NEXTVAL INTO :NEW.REPORT_FAV_SN FROM dual;
       EXCEPTION
         WHEN OTHERS THEN
           RAISE;
    END TB_REPORT_USER_PARAM_TRG;
    La table TB_REPORT_FAV n'existe pas, elle se crée correctement mais pas son trigger. Le script de migration échoue avec l'erreur suivante :
    ERROR at line 3:
    ORA-00942: table or view does not exist

    Si je met ON MonSchema.TB_REPORT_FAV je n'ai plus d'erreur mais cela m'ennuie fortement d'associer la table à un schéma dans mon trigger .

    J'ai bien vérifié les droits de mon utilisateur et j'ai bien tous les droits ! Alors pourquoi suis je obligé de mentionner mon schéma ?

    Version d'Oracle: v11.2.0.1.0
    Sous Windows XP 32 bits.

    merci à tous !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Si vous ne voulez pas indiquer le schéma il faut que l'utilisateur avec lequel vous vous connectez pointe sur ce schéma.

    Mais bon, c'est une bonne pratique de toujours indiquer le schéma des objets, ça lève les ambiguïtés.

    Au passage, puisque vous êtes en 11g, vous pouvez écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :NEW.REPORT_FAV_SN := SEQ_TB_REPORT_FAV.NEXTVAL;

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Il faut créer un synonyme (public ou non) sur la vue.
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  4. #4
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos réponses :
    @Waldar : Si vous ne voulez pas indiquer le schéma il faut que l'utilisateur avec lequel vous vous connectez pointe sur ce schéma.

    Comment faire pour que mon utilisateur "pointe" spécifiquement sur le schéma, je lui donne déjà tous les droits sur ce schéma ?

    @Garuda : De quelle vue parlez vous ? ma table TB_REPORT_FAV est une vraie table et non une vue.

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Enlevez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    EXCEPTION
         WHEN OTHERS THEN
           RAISE;
    ce code inutile ne sert à rien sinon à cacher le numéro de la ligne où l'erreur se produite.

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Daeron Voir le message

    ...mais cela m'ennuie fortement d'associer la table à un schéma dans mon trigger .
    ...
    Pourquoi ? Que-est-ce que vous essayez d’accomplir avec ce choix ?

  7. #7
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    @mnitu : nous avons des scripts pour éviter de nommer les schémas permettant d'avoir des schémas libres. C'est pour cela que l'on souhaitait ne pas nommer les tables dans les triggers.

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Qu’est-ce que une « schéma libre » ?

  9. #9
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Qu’est-ce que une « schéma libre » ?
    Un schéma dont le nom n'est pas codé en dur...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  10. #10
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    En fait, nous laissons libre choix à l'installation de choisir le nom du schéma, c'est très pratique pour la base d'archivage des données, même structure sans les triggers mais schéma différent. On peut l'appeler ainsi comme on veut "toto", "titi", "archive1", "prod" ou comme je l'avais mis "MonSchema". Cela implique donc d'avoir des scripts d'installation élaborés et on voudrait éviter de les changer pour mettre dedans le nom du schéma même en variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEFORE INSERT StringVariableSchema.TB_REPORT_FAV
    Quand j'ai fais des tests sur ma plateforme je n'ai eu aucune erreur et ma table TB_REPORT_FAV et son trigger se sont bien crées. Donc je suppose qu'il y a bien un souci au niveau des droits ou de reconnaissance du schéma "MonSchema".

  11. #11
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il n’est pas possible de créer un schéma Oracle sans préciser le nom donc au plus tard à ce moment le schéma n’est plus libre. Du ce point de vue on devrait parler de schéma au nom variable plutôt que libre. Par conséquence vos scripts devrait tout simplement paramétrer le schéma.

    Quand vos créez un trigger sur une table Oracle doit être capable de résoudre le nom de la table, c’est à dire de trouver une table ou sinon un synonyme privé ou publique qui correspond. Mais le script a pu tourner sur votre base précisément parce qu'un synonyme avait être crée à un moment donné. Par la suite la table qu’il référence a été supprimée ce qui n’entraîne pas la suppression du synonyme.

    J’ai du mal à voir en quoi cette stratégie peut être pratique mais bon.

  12. #12
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    En SQL, un objet qui n'est pas préfixé par un nom de schéma sera recherché dans le schéma courant.
    Si je suis connecté SYSTEM, SYSTEM est par défaut le schéma courant.

    L'instruction CREATE TRIGGER, aussi étonnant que cela paraisse, est du SQL (en tout cas jusqu'à DECLARE, ou BEGIN s'il n'y a pas de DECLARE).

    Donc si je suis SYSTEM et que j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TRIGGER nom_trigger
    ...
    ON nom_table
    le déclencheur sera créé dans le schéma SYSTEM et portera sur la table nom_table qui doit se situer dans le schéma SYSTEM. Si cette table n'y est pas, évidemment cela échoue.

    Même problème si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TRIGGER SCOTT.nom_trigger
    ...
    ON nom_table
    On a bien précisé le propriétaire du déclencheur, mais pas celui de la table, donc celle-ci est toujours recherchée dans le schéma SYSTEM.

    Donc plusieurs solutions :

    1) se connecter sous le compte qui doit être le propriétaire de la table et du déclencheur, sans préfixer la table ni le déclencheur par le schéma.
    Mais ce n'est pas terrible, car cela impose d'être capable de se connecter sous se compte.
    Or le DBA, si c'est lui qui exécute ces scripts, n'est pas censé connaître les mots de passe.
    De plus, si on ne fait pas attention et qu'on ne s'est pas connecté sous le bon compte, on risque de créer les objets n'importe où.

    2) préfixer le nom des objets par le schéma, défini comme variable de substitution. Il suffira de modifier ce DEFINE pour une exécution dans un schéma différent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    define SCHEMA=SCOTT
     
    connect system/&MDP
     
    CREATE OR REPLACE
    TRIGGER &SCHEMA..trigdemo
    BEFORE INSERT
    ON &SCHEMA..emp
    DECLARE
    	num int;
    BEGIN
       select count(*) into num from dept;
    END;
    /
    Vous pouvez en revanche remarquer que je n'ai pas préfixé les objets à l'intérieur du déclencheur (à partir du DECLARE).
    Par défaut (mode AUTHID DEFINER), ceux-ci seront recherchés dans le schéma dans lequel on crée le déclencheur, ce qui convient dans la plupart des cas.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  13. #13
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 80
    Points : 47
    Points
    47
    Par défaut
    Merci à tous pour vos réponses.
    Je comprends mieux le pourquoi du comment merci encore pour tes explications claires Pomalaix.

    J'ai une dernière question : comment connaître le schéma par défaut d'un utilisateur ?

  14. #14
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    Citation Envoyé par Daeron Voir le message
    ...J'ai une dernière question : comment connaître le schéma par défaut d'un utilisateur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SYSTEM@DEMO>show user
    USER est "SYSTEM"
     
    SYSTEM@DEMO>select sys_context('userenv', 'current_schema') AS schema from dual;
     
    SCHEMA
    ---------------
    SYSTEM
     
    SYSTEM@DEMO>alter session set current_schema=SCOTT;
     
    Session modifiée.
     
    SYSTEM@DEMO>select sys_context('userenv', 'current_schema') AS schema from dual;
     
    SCHEMA
    ---------------
    SCOTT
    Le schéma courant est tout simplement le schéma de l'utilisateur, sauf si on a l'idée tordue de faire un ALTER SESSION pour le modifier.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  15. #15
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Citation Envoyé par Daeron Voir le message
    Merci pour vos réponses :
    @Waldar : Si vous ne voulez pas indiquer le schéma il faut que l'utilisateur avec lequel vous vous connectez pointe sur ce schéma.

    Comment faire pour que mon utilisateur "pointe" spécifiquement sur le schéma, je lui donne déjà tous les droits sur ce schéma ?

    @Garuda : De quelle vue parlez vous ? ma table TB_REPORT_FAV est une vraie table et non une vue.
    Effectivement ! Mais l'important dans ma réponse , c'est le fait de créer un synonyme pas l'objet sur lequel il pointe !
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ora-00942 lors d'un truncate sur une table qui existe
    Par olivier] dans le forum Oracle
    Réponses: 2
    Dernier message: 17/11/2011, 17h08
  2. Réponses: 0
    Dernier message: 13/07/2011, 13h57
  3. Erreur ora 30574 lors de la création d'1 rollback_segment
    Par leng dans le forum Administration
    Réponses: 15
    Dernier message: 08/12/2006, 17h02
  4. [Oracle10gR2] ORA-00604 lors de la création d'une BDD
    Par Darkdaemons dans le forum Oracle
    Réponses: 9
    Dernier message: 07/11/2006, 10h22
  5. comment eviter ora-00942 lors d'un drop table
    Par sqlakf76 dans le forum Oracle
    Réponses: 22
    Dernier message: 11/10/2005, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo