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 :

Comment trouver la date de la dernière modification d'une table ? [10g]


Sujet :

Administration Oracle

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut Comment trouver la date de la dernière modification d'une table ?
    Comment trouver la date de la dernière modification d'une table ?

    J'ai trouvé la table ALL_TAB_MODIFICATIONS, qui avait l'air de correspondre à ça, mais la table que je cherche n'y figure pas.
    Et pourtant, la table en question est modifiée chaque jour (plus d'une fois).
    J'ai trié ALL_TAB_MODIFICATIONS par date, et je vais de 2010 à hier. Donc ma table ne peut pas ne pas y figurer.

    J'ai raté quelques chose ?
    Sinon, existe t'il une autre table pour ce que je cherche ?

  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 386
    Points
    18 386
    Par défaut
    Vous parlez de modification de données (DML) ou de structure (DDL) ?

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous parlez de modification de données (DML) ou de structure (DDL) ?
    De données.
    (c'est vrai que j'ai pas précisé)

  4. #4
    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
    Il y a la pseudo colonne ORA_ROWSCN dans chaque table depuis la V10, mais ce n'est pas très exploitable.
    On a dû en parler ici à l'occasion, une recherche sur ce mot-clé devrait vous aider.

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Bah, pour la date de dernière modification de la table, c'est pas mal max(TIMESTAMP_TO_SCN(ora_rowscn)), non ? (Mis à part que ça peut te renvoyer null )

    Le plus gros problème avec cette fonction, c'est que pour une ligne, on récupère le dernier scn du bloc, et non de la ligne (à moins de forcer la rowdependencie)... mais ce problème ne se pose pas ici...

  6. #6
    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
    Tiens, j'ai retrouvé un sujet où j'avais détaillé la chose :
    http://www.developpez.net/forums/d10...e/#post5777588

  7. #7
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Bon, j'ai essayé mais j'obtiens une erreur :
    Erreur : l'exécution de la requête a échoué !

    ORA-08181: specified number is not a valid system change number
    ORA-06512: at "SYS.SCN_TO_TIMESTAMP", line 1


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    --select max(SCN_TO_TIMESTAMP(ORA_ROWSCN)) 
    select ORA_ROWSCN, SCN_TO_TIMESTAMP(ORA_ROWSCN) 
    from PRODUIT
    order by ORA_ROWSCN desc
    J'ai essayé une autre table (pour vérifier), mais j'obtiens bien la même erreur.


    En tout cas, je comprend que c'est pas simple ...

  8. #8
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Citation Envoyé par Lung Voir le message
    Bon, j'ai essayé mais j'obtiens une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    --select max(SCN_TO_TIMESTAMP(ORA_ROWSCN)) 
    select ORA_ROWSCN, SCN_TO_TIMESTAMP(ORA_ROWSCN) 
    from PRODUIT
    order by ORA_ROWSCN desc
    J'ai essayé une autre table (pour vérifier), mais j'obtiens bien la même erreur.


    En tout cas, je comprend que c'est pas simple ...
    L'explication de cette erreur est dans le message de Pomalaix dont il a donné le lien juste avant votre message :
    Citation Envoyé par Pomalaix Voir le message
    2) La fonction SCN_TO_TIMESTAMP fait appel à la table système SMON_SCN_TIME, qui stocke la correspondance entre SCN et temps. (Cette correspondance ne peut pas être obtenue par une formule de calcul, car les SCN et le temps évoluent de manière autonome. Il n'y a donc pas d'autre solution que de stocker régulièrement les valeurs respectives).
    Le souci, c'est que SMON_SCN_TIME a une capacité limitée, à ma connaissance non paramétrable, qui serait de 5 jours dans le cas le plus défavorable.

    Exemple de modification trop ancienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select scn_to_timestamp(ora_rowscn) from hr.employees
           *
    ERREUR à la ligne 1 :
    ORA-08181: le numéro indiqué n'est pas un SCN valide
    ORA-06512: à "SYS.SCN_TO_TIMESTAMP", ligne 1

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Citation Envoyé par FSiebert Voir le message
    L'explication de cette erreur est dans le message de Pomalaix dont il a donné le lien juste avant votre message :
    Citation Envoyé par Pomalaix
    Le souci, c'est que SMON_SCN_TIME a une capacité limitée, à ma connaissance non paramétrable, qui serait de 5 jours dans le cas le plus défavorable.
    Bin oui, mais dans mon cas, c'est une table qui est modifiée tous les jours (et plein de fois). Ca devrait marcher, non ?

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Sauf que tu fais la conversion pour toutes les lignes !
    Tu peux par exemple écrire une fonction qui encapsule la conversion, zappe l'exception et renvoie null à la place.

  11. #11
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Si t'es en Oracle 12c, tu n'as même pas besoin de créer ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WITH FUNCTION fscnt (rscn in NUMBER) RETURN timestamp IS BEGIN return scn_to_timestamp(rscn); EXCEPTION WHEN OTHERS THEN return null; END;
    SELECT max(fsnct(ora_rowscn))
    FROM tatable;

  12. #12
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Citation Envoyé par Lung Voir le message
    Bin oui, mais dans mon cas, c'est une table qui est modifiée tous les jours (et plein de fois). Ca devrait marcher, non ?
    Comme expliqué par pacmann, vous appliquez la fonction sur toutes les lignes.

    Pourquoi ne pas faire le MAX sur le SCN (qui a priori augmente toujours) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN)) FROM ma_table;
    Si vous avez besoin de plus d'informations que la MAX, la solution de pacmann est intéressante.

  13. #13
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut dbms_stats.flush_database_monitoring_info
    Bonjour,
    Citation Envoyé par Lung Voir le message
    Et pourtant, la table en question est modifiée chaque jour (plus d'une fois).
    J'ai trié ALL_TAB_MODIFICATIONS par date, et je vais de 2010 à hier. Donc ma table ne peut pas ne pas y figurer.
    ALL_TAB_MODIFICATIONS n'est rafraîchie que toutes les 15 minutes (depends de la version d'Oracle). Normal, les infor sont gardées en mémoire et ne vont pas être écrites à chaque exécution.
    Il est possible de forcer le rafraîchissement avec: dbms_stats.flush_database_monitoring_info

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > create table TEST as select * from dual
    table TEST created.
    > insert into TEST select * from dual connect by level <= 1000
    1,000 rows inserted.
    > exec dbms_stats.flush_database_monitoring_info
    anonymous block completed
    > select * from all_tab_modifications where table_name='TEST'
    TABLE_OWNER                                                                                                                      TABLE_NAME                                                                                                                       PARTITION_NAME                                                                                                                   SUBPARTITION_NAME                                                                                                                   INSERTS    UPDATES    DELETES TIMESTAMP            TRUNCATED DROP_SEGMENTS
    -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ---------- ---------- ---------- -------------------- --------- -------------
    FRANCK                                                                                                                           TEST                                                                                                                                                                                                                                                                                                                                                                                                     1000          0          0 29-JUL-13 13:47:14   NO                    0
    Par contre, c'est remis à zéro à chaque calcul de stats. Donc ne rien trouver dans ALL_TAB_MODIFICATIONS peut vouloir dire qu'il n'y a pas eu de de modif depuis le dernier calcul de stats.

    Cordialement,
    Franck.

  14. #14
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Tiens, j'ai retrouvé un sujet où j'avais détaillé la chose :
    http://www.developpez.net/forums/d10...e/#post5777588
    Ah tiens, je viens de me souvenir d'un autre cas où ça coince : lors d'un delayed block cleanout, il se peut que le SCN apposé soit estimé à défaut d'avoir le bon (lorsque l'undo correspondant n'est plus dispo)

  15. #15
    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 386
    Points
    18 386
    Par défaut
    Il faudrait en fait connaître la finalité du besoin afin d'établir la solution qui conviendrait le mieux.

  16. #16
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Citation Envoyé par pacmann Voir le message
    Ah tiens, je viens de me souvenir d'un autre cas où ça coince : lors d'un delayed block cleanout, il se peut que le SCN apposé soit estimé à défaut d'avoir le bon (lorsque l'undo correspondant n'est plus dispo)
    ORA_ROWSCN est défini comme the conservative upper bound system change number (SCN) of the most recent change to the row
    Ce qui veut dire que la valeur peut être plus récente que la modif.

    Tout ce qu'il permet de savoir c'est qu'il n'y a pas eu de modification postérieure au ORA_ROWSCN.

    Cordialement,
    Franck.

  17. #17
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Oui Franck, je suis au courant.
    Pomalaix décrivait la granularité du SCN était de niveau bloc, sauf rowdependencies ; je précisais simplement qu'il y a d'autres cas où ce n'est pas le commit scn de la ligne.

  18. #18
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Citation Envoyé par FSiebert Voir le message
    Pourquoi ne pas faire le MAX sur le SCN (qui a priori augmente toujours) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN)) FROM ma_table;
    Cette fois, en mettant le max à l'intérieur, j'obtiens bien un résultat (qui à priori est vraissemblable).

    Citation Envoyé par pachot Voir le message
    Par contre, c'est remis à zéro à chaque calcul de stats. Donc ne rien trouver dans ALL_TAB_MODIFICATIONS peut vouloir dire qu'il n'y a pas eu de de modif depuis le dernier calcul de stats.
    C'est bon à savoir.
    Question bête (je suis pas DBA): Les stats sont calculées à quelle fréquence ? C'est un paramètre ? C'est en fonction d'une action précise ?

    Citation Envoyé par Waldar Voir le message
    Il faudrait en fait connaître la finalité du besoin afin d'établir la solution qui conviendrait le mieux.
    En fait, il semblerait qu'un traitement automatique ne fonctionne plus (très mal conçu : il ne génère pas de log et ne dit pas ce qu'il fait).
    Une solution pour savoir si la table en question était bien mise à jour (ou pas) était de connaitre la date de la dernière modification de données.

    Maintenant que j'ai enfin un résultat, je vais pouvoir agir en conséquence.

  19. #19
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Question bête (je suis pas DBA): Les stats sont calculées à quelle fréquence ? C'est un paramètre ? C'est en fonction d'une action précise ?
    Ca dépend. Mais le job automatique par défaut va calculer les stats lorsqu'il voit des modifications importantes sur une table (justement en utilisant DBA_TAB_MODIFICATIONS, c'est pour ça qu'il la remet à zéro après)

    Du coup:
    -> pas de modifs -> rien dans DBA_TAB_MODIFICATIONS
    -> beaucoup de modif -> calcul de stats la nuit suivante -> rien dans DBA_TAB_MODIFICATIONS

    D'où la difficulté de l'utiliser dans ce cas...

    Par contre si LAST_ANALYZED est vieux de 3 mois et qu'il n'y a rien dans DBA_TAB_MODIFICATIONS alors on peut dire qu'il n'y a pas eu de modifs depuis 3 mois.

  20. #20
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 671
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 671
    Points : 7 044
    Points
    7 044
    Par défaut
    Citation Envoyé par pachot Voir le message
    Ca dépend. Mais le job automatique par défaut va calculer les stats lorsqu'il voit des modifications importantes sur une table (justement en utilisant DBA_TAB_MODIFICATIONS, c'est pour ça qu'il la remet à zéro après)

    Du coup:
    -> pas de modifs -> rien dans DBA_TAB_MODIFICATIONS
    -> beaucoup de modif -> calcul de stats la nuit suivante -> rien dans DBA_TAB_MODIFICATIONS

    D'où la difficulté de l'utiliser dans ce cas...

    Par contre si LAST_ANALYZED est vieux de 3 mois et qu'il n'y a rien dans DBA_TAB_MODIFICATIONS alors on peut dire qu'il n'y a pas eu de modifs depuis 3 mois.
    pour ces précisions.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/04/2015, 03h27
  2. Réponses: 6
    Dernier message: 09/02/2015, 10h54
  3. [AC-2003] récupérer date de dernière modification d'une table
    Par granddebutant dans le forum VBA Access
    Réponses: 1
    Dernier message: 05/12/2011, 17h11
  4. Réponses: 3
    Dernier message: 17/07/2007, 15h21
  5. date de dernière modification d'une table ?
    Par NiBicUs dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2004, 18h11

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