Comment savoir quand une table Oracle a été mis à jour pour la dernière fois
Puis-je connaître la date de la dernière requête INSERT, UPDATE ou DELETE a été réalisée sur une table dans une base de données Oracle et si oui, comment?
Un peu de contexte: La version Oracle 10g. J'ai un lot de l'application qui s'exécute régulièrement, lit les données à partir d'une seule table Oracle et l'écrit dans un fichier. Je voudrais sauter cette étape si les données n'a pas changé depuis la dernière exécution de la tâche.
L'application est écrite en C++ et communique avec Oracle via BEC. Il se connecte à Oracle avec un utilisateur "normal", donc je ne peux pas utiliser tout spécial admin choses.
Edit: Bon, "Spécial Admin Trucs" n'était pas exactement une bonne description. Ce que je veux dire, c'est: je ne peux rien faire en plus du choix de tables et de l'appel de procédures stockées. Changer quoi que ce soit à propos de la base de données elle-même (comme l'ajout d'éléments déclencheurs), n'est malheureusement pas une option si vous souhaitez obtenir fait avant 2010.
- Oui... le 2010 commentaire est à propos de la lenteur de vos Dba-je le prendre?
- Bien, genre de. Ils sont lents, mais comme je l'ai dit dans un précédent commentaire, je les comprends. Si il y a un problème avec cette base de données, il est vraiment laid, vraiment rapide. Vous pouvez obtenir des trucs là, mais seulement après qu'il a été analysé à l'enfer par un tas de gens.
- Comme je ne peux pas commenter sur les réponses encore (je suis nouveau ici), je voulais faire remarquer que j'ai trouvé que la CDC a été supprimé à partir d'Oracle 12c de pousser les gens à acheter GoldenGate. docs.oracle.com/database/121/UPGRD/deprecated.htm#UPGRD60083
Vous devez vous connecter pour publier un commentaire.
Puisque vous êtes sur 10g, vous pouvez éventuellement utiliser le
ORA_ROWSCN
pseudo-colonne. Cela vous donne une limite supérieure de la dernière SCN (système de changement de numéro) qui a provoqué un changement dans la ligne. Puisque c'est une suite croissante, vous pouvez stocker hors le maximumORA_ROWSCN
que vous avez vu et puis regardez seulement pour les données avec un SCN plus que cela.Par défaut,
ORA_ROWSCN
est en fait maintenu au niveau du bloc, de sorte qu'une modification d'une ligne dans un bloc de changer leORA_ROWSCN
pour toutes les lignes dans le bloc. C'est probablement tout à fait suffisant si l'intention est de réduire le nombre de lignes que vous le processus à plusieurs reprises sans modifications, si nous parlons de "normal" d'accès aux données des modèles. Vous pouvez reconstruire la table avecROWDEPENDENCIES
qui sera la cause de laORA_ROWSCN
à être suivis au niveau de la ligne, qui vous donne des informations plus précises mais requiert un effort de reconstruction de la table.Une autre option serait de configurer quelque chose comme la Capture de Données modifiées (CDC) et de faire de votre BEC de l'application d'un abonné de modifications apportées à la table, mais qui requiert un effort pour configurer la CDC.
Je suis vraiment la fin de cette partie, mais voici comment je l'ai fait:
Il est assez proche pour mes fins.
Demandez à votre DBA sur l'audit. Il peut commencer une vérification avec une simple commande comme :
Ensuite, vous pouvez interroger la table USER_AUDIT_OBJECT pour déterminer s'il y a un encart sur votre table depuis la dernière exportation.
google pour Oracle audit pour plus d'info...
dbms_stats.flush_database_monitoring_info
à le faire jusqu'à date, après la collecte des statistiques il n'existe aucune entrée de ce point de vue et aussi déjà, elle enregistre les modifications avant de commettre.Peut vous exécutez un contrôle quelconque sur le résultat et les stocker localement? Puis, quand votre application interroge la base de données, vous pouvez comparer sa somme de contrôle et de déterminer si vous devez l'importer?
Il semble que vous pouvez être en mesure d'utiliser le ORA_HASH fonction pour accomplir cette tâche.
Mise à jour: une Autre bonne ressource: 10g de ORA_HASH fonction pour déterminer si deux tables Oracle de données sont égales
Oracle pouvez regarder les tableaux pour les changements et lorsqu'un changement se produit peut exécuter une fonction de rappel en PL/SQL ou BEC. Le rappel obtient un objet qui est une collection de tableaux qui a changé, et qui présente une collection de rowid qui a changé, et le type d'action, Ins, upd, del.
De sorte que vous n'avez même pas aller à la table, vous vous asseyez et attendez d'être appelé. Vous n'aurez qu'à aller si il y a des changements à écrire.
Il est appelé Notification De Changement De Base De Données. C'est beaucoup plus simple que la CDC comme Justin mentionnés, mais ils demandent un peu de fantaisie admin choses. La bonne nouvelle est qu'aucun de ces nécessiter des modifications à la DEMANDE.
Le problème, c'est que la CDC est bien pour un volume élevé de tables, de la DCN ne l'est pas.
Si l'audit est activé sur le serveur, il suffit simplement d'utiliser
Vous devrez ajouter un déclencheur sur insert, update, delete, qui définit une valeur dans une autre table à sysdate.
Lorsque vous exécutez l'application, il serait lire la valeur et de l'enregistrer quelque part afin que la prochaine fois qu'il est exécuté, il est une référence pour comparer.
Pensez-vous que "Spécial Admin Trucs"?
Il serait mieux pour décrire ce que vous êtes en train de faire de sorte que vous obtenez des réponses plus claires.
Combien de temps le processus de traitement par lots pour écrire le fichier? Il peut être plus facile de laisser aller de l'avant et de comparer ensuite le fichier à l'encontre d'une copie du fichier de la précédente afin de voir si elles sont identiques.
Si quelqu'un est toujours à la recherche d'une réponse, ils peuvent utiliser Notification De Changement De Base De Données Oracle fonction venir avec Oracle 10g. Il nécessite
CHANGE NOTIFICATION
système de privilège. Vous pouvez enregistrer des écouteurs quand déclencher une notification à l'application.Veuillez utiliser la déclaration ci-dessous