Question Comment savoir quand une table Oracle a été mise à jour la dernière fois


Puis-je savoir quand la dernière instruction INSERT, UPDATE ou DELETE a été effectuée sur une table d'une base de données Oracle et, si oui, comment?

Un peu d'arrière-plan: la version Oracle est 10g. J'ai une application batch qui s'exécute régulièrement, lit les données d'une seule table Oracle et les écrit dans un fichier. Je voudrais sauter ceci si les données n'ont pas changé depuis la dernière exécution du travail.

L'application est écrite en C ++ et communique avec Oracle via OCI. Il se connecte à Oracle avec un utilisateur "normal", donc je ne peux pas utiliser d’administration spéciale.

Edit: Ok, "Special Admin Stuff" n'était pas exactement une bonne description. Ce que je veux dire, c'est: je ne peux rien faire en dehors de la sélection des tables et de l’appel des procédures stockées. Changer quelque chose sur la base de données elle-même (comme l'ajout de déclencheurs) n'est malheureusement pas une option si vous voulez le faire avant 2010.


21
2017-11-05 13:26


origine


Réponses:


Comme vous êtes sur 10g, vous pourriez potentiellement utiliser le ORA_ROWSCN pseudo-colonne. Cela vous donne une limite supérieure du dernier SCN (numéro de modification du système) qui a provoqué une modification de la ligne. Comme il s'agit d'une séquence croissante, vous pouvez stocker le maximum ORA_ROWSCN que vous avez vu et ensuite rechercher uniquement les données avec un SCN supérieur à celui.

Par défaut, ORA_ROWSCN est en fait maintenu au niveau du bloc, donc un changement à une ligne dans un bloc changera le ORA_ROWSCN pour toutes les lignes du bloc. Cela est probablement suffisant si l’intention est de minimiser le nombre de lignes que vous traitez plusieurs fois, sans aucune modification si nous parlons de modèles d’accès aux données "normaux". Vous pouvez reconstruire la table avec ROWDEPENDENCIES ce qui provoquera la ORA_ROWSCN à suivre au niveau de la ligne, ce qui vous donne des informations plus précises mais nécessite un effort ponctuel pour reconstruire la table.

Une autre option consisterait à configurer quelque chose comme Change Data Capture (CDC) et à faire de votre application OCI un abonné aux modifications apportées à la table, mais cela nécessite également un effort ponctuel pour configurer CDC.


35
2017-11-05 15:33



Je suis vraiment en retard pour cette fête mais voici comment je l'ai fait:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

C'est assez proche de mes objectifs.


39
2017-07-26 15:35



Demandez à votre administrateur de base de données sur l'audit. Il peut lancer un audit avec une commande simple comme:

AUDIT INSERT ON user.table

Ensuite, vous pouvez interroger la table USER_AUDIT_OBJECT pour déterminer s'il y a eu une insertion sur votre table depuis la dernière exportation.

google for Oracle audit pour plus d'infos ...


9
2017-11-05 14:35



SELECT * FROM all_tab_modifications;

6
2017-08-25 14:41



Pourriez-vous exécuter une somme de contrôle sur le résultat et la stocker localement? Ensuite, lorsque votre application interroge la base de données, vous pouvez comparer sa somme de contrôle et déterminer si vous devez l'importer?

Il semble que vous puissiez utiliser le ORA_HASH fonction pour accomplir cela.

Mettre à jour: Une autre bonne ressource: La fonction ORA_HASH de 10g pour déterminer si les données de deux tables Oracle sont égales


5
2017-11-05 13:59



Oracle peut surveiller les tables pour détecter les modifications et, en cas de modification, exécuter une fonction de rappel dans PL / SQL ou OCI. Le callback obtient un objet qui est une collection de tables qui a changé et qui a une collection de rowid qui a changé et le type d'action, Ins, upd, del.

Donc, vous n'allez même pas à la table, vous êtes assis et attendez d'être appelé. Vous n'irez que s'il y a des changements à écrire.

C'est appelé Notification de modification de base de données. C'est beaucoup plus simple que CDC, comme Justin l'a mentionné, mais les deux nécessitent des trucs d'administration sophistiqués. La bonne partie est que ni l'un ni l'autre ne nécessitent des modifications à l'APPLICATION.

La mise en garde est que CDC est bien pour les tables à fort volume, DCN ne l'est pas.


3
2017-11-05 16:27



Vous devez ajouter un déclencheur lors de l'insertion, de la mise à jour et de la suppression qui définit une valeur dans une autre table à sysdate.

Lorsque vous exécutez l'application, celle-ci lit la valeur et l'enregistre quelque part afin que la prochaine fois qu'elle s'exécute, elle dispose d'une référence à comparer.

Considérez-vous que "Special Admin Stuff"?

Il serait préférable de décrire ce que vous faites réellement pour obtenir des réponses plus claires.


1
2017-11-05 13:34