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

Administration Oracle Discussion :

[11g] Origine d'une invalidation de procédure PL/SQL


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut [11g] Origine d'une invalidation de procédure PL/SQL
    Bonjour à tous

    Sur une release 11g (11.2.0.2) nous rencontrons depuis quelques temps un phénoméne curieux : plusieurs procédures PL/SQL deviennent invalides alors que les objets référants ne font l'objet d'aucunes altérations : interrogation de la vue DBA_OBJECTS et notamment du champ LAST_DDL_TIME ne donne rien

    ceci peut arriver plusieurs fois par jour pour certaines procédures.

    La seule particularité de ces procédures est qu'elles accédent à certaines vues du dictionnaires (ALL_TABLES,..). Est-il possible que certaines modifications du dictionnaire pourraient expliquer ce phénoméne ?

    Avez-vous une solution pour introspecter ce problème ? Mise en trace ? Audit ?

    merci pour votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Au prix qu'on paye....
    Il y a des vues toutes faites pour ca.
    Exemple: (DBA/USER)_DEPENDENCIES
    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
    19
    20
    21
    create or replace procedure tmp_proc1 is
    begin
       dbms_lock.sleep(1);
    end;
    /
    create or replace procedure tmp_proc2 is
    l_num number;
    begin
       tmp_proc1;
       tmp_proc1;
       l_num:=dbms_random.value;
    end;
    /
     
    create or replace procedure tmp_proc3 is
    begin
       tmp_proc2;
    end;
    /
     
    select name, referenced_owner, referenced_name, referenced_type from user_dependencies where name like 'TMP_PROC_' order by 1;
    Et dans cet exemple, j'obtiens le resultat suivant:
    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
    TMP@MINILHC >select name, referenced_owner, referenced_name, referenced_type from user_dependencies where name like 'TMP_PROC_' order by 1;
     
    NAME                 REFERENCED_OWNER               REFERENCED_NAME                REFERENCED_TYPE
    -------------------- ------------------------------ ------------------------------ ------------------
    TMP_PROC1            SYS                            SYS_STUB_FOR_PURITY_ANALYSIS   PACKAGE
    TMP_PROC1            PUBLIC                         DBMS_LOCK                      SYNONYM
    TMP_PROC1            SYS                            STANDARD                       PACKAGE
    TMP_PROC2            SYS                            SYS_STUB_FOR_PURITY_ANALYSIS   PACKAGE
    TMP_PROC2            PUBLIC                         DBMS_RANDOM                    SYNONYM
    TMP_PROC2            TMP                            TMP_PROC1                      PROCEDURE
    TMP_PROC2            SYS                            STANDARD                       PACKAGE
    TMP_PROC3            TMP                            TMP_PROC2                      PROCEDURE
    TMP_PROC3            SYS                            SYS_STUB_FOR_PURITY_ANALYSIS   PACKAGE
     
    9 rows selected.
    Apres, si vous modifiez des tables, alors oui ca invalide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    drop procedure tmp_proc1;
    drop procedure tmp_proc2;
    drop procedure tmp_proc3;
    create table tmp_tab (n number);
    create or replace procedure tmp_proc1 is
       l_var tmp_tab%rowtype;
    begin
       select * into l_var from tmp_tab;
    end;
    /
    select status from user_objects where object_name='TMP_PROC1';
    select name, referenced_owner, referenced_name, referenced_type from user_dependencies where name like 'TMP_PROC_' order by 1;
    alter table tmp_tab add (vc varchar2(20));
    select status from user_objects where object_name='TMP_PROC1';
    Et:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    TMP@MINILHC >select status from user_objects where object_name='TMP_PROC1';
     
    STATUS
    -------
    VALID
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >select name, referenced_owner, referenced_name, referenced_type from user_dependencies where name like 'TMP_PROC_' order by 1;
     
    NAME                 REFERENCED_OWNER               REFERENCED_NAME                REFERENCED_TYPE
    -------------------- ------------------------------ ------------------------------ ------------------
    TMP_PROC1            SYS                            STANDARD                       PACKAGE
    TMP_PROC1            TMP                            TMP_TAB                        TABLE
    TMP_PROC1            SYS                            SYS_STUB_FOR_PURITY_ANALYSIS   PACKAGE
     
    Elapsed: 00:00:00.05
    TMP@MINILHC >alter table tmp_tab add (vc varchar2(20));
     
    Table altered.
     
    Elapsed: 00:00:00.00
    TMP@MINILHC >select status from user_objects where object_name='TMP_PROC1';
     
    STATUS
    -------
    INVALID

  3. #3
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par PpPool Voir le message
    Bonjour à tous

    Sur une release 11g (11.2.0.2) nous rencontrons depuis quelques temps un phénoméne curieux : plusieurs procédures PL/SQL deviennent invalides alors que les objets référants ne font l'objet d'aucunes altérations : interrogation de la vue DBA_OBJECTS et notamment du champ LAST_DDL_TIME ne donne rien

    ceci peut arriver plusieurs fois par jour pour certaines procédures.

    La seule particularité de ces procédures est qu'elles accédent à certaines vues du dictionnaires (ALL_TABLES,..). Est-il possible que certaines modifications du dictionnaire pourraient expliquer ce phénoméne ?

    Avez-vous une solution pour introspecter ce problème ? Mise en trace ? Audit ?

    merci pour votre aide
    Est-ce que ces procédures ont été créés toutes seules ou elles sont incluses dans des packages?

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Est-ce que ces procédures ont été créés toutes seules ou elles sont incluses dans des packages?
    Bonjour Mohamed
    Merci pour ta réponse

    Non des procédures simples

    @Rams7s
    Nous interrogeons en effet DBA_DEPENDENCIES

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par PpPool Voir le message
    Bonjour Mohamed
    Merci pour ta réponse

    Non des procédures simples

    @Rams7s
    Nous interrogeons en effet DBA_DEPENDENCIES
    Et qu'est ce que vous avez dans dba_errors (ou user_errors)?

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Et qu'est ce que vous avez dans dba_errors (ou user_errors)?
    rien qui concerne cette procédure
    Celle-ci tourne actuellement sans problèmes
    je vais voir demain

    je soupçonne des invalidations de obj_id au niveau du dictionnaire. on a déjà connu ce genre de problème avec des tables
    merci en tout cas de votre aide

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Au niveau de l'analyse des dépendances, on utilise cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT dd.referenced_owner, dd.referenced_name, dd.referenced_type,
           DO.created, DO.last_ddl_time
      FROM dba_dependencies dd, dba_objects DO
     WHERE dd.referenced_owner = DO.owner
       AND dd.referenced_name = DO.object_name
       AND dd.referenced_type = DO.object_type
       AND dd.NAME = '<PS>'
       AND dd.owner = '<OWNER>'
       AND (   DO.last_ddl_time >= TO_DATE ('23/05/2012', 'DD/MM/YYYY')
            OR DO.created >= TO_DATE ('23/05/2012', 'DD/MM/YYYY')
           )
    Aucun objet référencé par la PS n'a été re-créé, ni altéré
    pourtant la PS ce matin était en status INVALID
    bizarre, j'ai dit bizarre -)

  8. #8
    Membre expérimenté
    Inscrit en
    Janvier 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 135
    Par défaut
    Citation Envoyé par PpPool Voir le message
    Bonjour à tous
    ...
    plusieurs procédures PL/SQL deviennent invalides alors que les objets référants ne font l'objet d'aucunes altérations : interrogation de la vue DBA_OBJECTS et notamment du champ LAST_DDL_TIME ne donne rien
    ...
    Avez-vous une solution pour introspecter ce problème ? Mise en trace ? Audit ?
    Quelqu'un at-il exécuter dbms_utility.invalidate?

    Audit DDL on table1 et table2, ...

Discussions similaires

  1. truncate dans une procédure PL/SQL
    Par pierre.egaud dans le forum PL/SQL
    Réponses: 14
    Dernier message: 27/11/2006, 17h27
  2. Réponses: 4
    Dernier message: 12/12/2005, 17h25
  3. Pb pour executer une procédure sous SQL PLUS
    Par rabddoul dans le forum Oracle
    Réponses: 4
    Dernier message: 21/10/2005, 15h40
  4. [XSLFO] Redimensionnement original d'une image ?
    Par elitost dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/09/2005, 13h49
  5. [Oracle] Exécuter une procédure PL/SQL en PHP?
    Par Cerberes dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 25/02/2005, 14h11

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