Bonjour,
Je suis en Oralce 10G R2. Je souhaite savoir s'il y a une vue DBA qui me donnerait la dernière date à laquelle j'ai modifié ou inséré des lignes dans une table oracle.
En vous remerciant,
LBO72.
Bonjour,
Je suis en Oralce 10G R2. Je souhaite savoir s'il y a une vue DBA qui me donnerait la dernière date à laquelle j'ai modifié ou inséré des lignes dans une table oracle.
En vous remerciant,
LBO72.
je dirai non. Je ne crois pas qu'il y ai une vue avec ce genre d'informations... Mais je ne suis pas sur
je dirais pareil.
la vue dba_tab_modifications donnera les modif faites depuis le dernier calcul de stats (inserts, delete, ...) mais c'est très approximatif si les stats ne sont pas forcées tous les jours. sinon, il reste l'audit sur les tables ou la base en entier, ou encore alimenter une table avec un trigger after update after insert par exemple.
C'est la réponse à laquelle je m'attendais... :-(
Merci.
LBO72.
La réponse n'est pas strictement négative, au pire, ça dépend.
Depuis la V10 il existe dans chaque table la pseudo-colonne ORA_ROWSCN, qui mémorise le SCN de la dernière modification apportée au bloc dans lequel se situe la ligne de données consultée.
Ce SCN peut être converti en temps grâce à la fonction SCN_TO_TIMESTAMP.
Pour savoir de quand date la dernière modification d'une table, on peut donc utiliser le max, ce qui ramène donc la date de modification du bloc modifié le plus récemment :
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 col temps format A30 select ora_rowscn, scn_to_timestamp(ora_rowscn) temps, ename, sal from emp; ORA_ROWSCN TEMPS ENAME SAL ---------- ------------------------------ ---------- ---------- 5061570 09/02/11 18:20:22,000000000 SMITH 800 5061570 09/02/11 18:20:22,000000000 ALLEN 1600 5061570 09/02/11 18:20:22,000000000 WARD 1250 5061570 09/02/11 18:20:22,000000000 JONES 2975 5061570 09/02/11 18:20:22,000000000 MARTIN 1250 5061570 09/02/11 18:20:22,000000000 BLAKE 2850 5061570 09/02/11 18:20:22,000000000 CLARK 2450 5061570 09/02/11 18:20:22,000000000 SCOTT 3000 5061570 09/02/11 18:20:22,000000000 KING 5000 5061570 09/02/11 18:20:22,000000000 TURNER 1500 5061570 09/02/11 18:20:22,000000000 ADAMS 1100 5061570 09/02/11 18:20:22,000000000 JAMES 950 5061570 09/02/11 18:20:22,000000000 FORD 3000 5061570 09/02/11 18:20:22,000000000 MILLER 1300
Ce mécanisme présente 2 défauts qui le rendent d'un intérêt aléatoire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part select max(scn_to_timestamp(ora_rowscn)) from emp;
1) Par défaut, la granularité est du niveau du bloc : on a l'impression que toutes les lignes du bloc ont été modifiées à la même date, ce qui peut être complètement faux.
Pour avoir une granularité de niveau ligne, il faut recréer la table avec l'option ROWDEPENDENCIES, ce qui en général n'est pas possible, pas souhaitable ou trop tardif face au besoin immédiat de savoir de quand date la modification.
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
Tout ça pour dire que si vous vous intéressez à une modification récente, vous pouvez le savoir facilement (à l'échelle du bloc), sinon vous devez mettre en place des colonnes d'audit (date_modif, auteur) dans vos tables.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager