Oracle 10g: correctement à l'aide ora_rowscn pour détecter les changements de ligne de table (c.-à-insertions, mises à jour, suppressions)

dba.stackexchange https://dba.stackexchange.com/questions/5061

Question

Des recherches dans la vérification lorsque les enregistrements d'une table dernière mise à jour, modifiés ou supprimés m'a conduit à la colonne pseudo connue sous le nom ora_rowscn.

D'abord, je fais ceci:

select max(ora_rowscn) from tablename;

Je prends note du nombre. Ensuite, je fais un insert, mise à jour et une suppression, vérifiez que la valeur maximum avant et après chaque. Il semble augmenter pour chaque type de changement.

Si vous vous demandez pourquoi je fais cela, nous cache une liste d'entités dans nos fenêtres C # service. Ce service fonctionne sur deux serveurs d'équilibrage de charge, donc il y a une instance distincte de chaque course. Lorsqu'une mise à jour se produit sur le serveur A, B serveur a besoin de savoir à ce sujet. Ce que je veux faire est cache max (ora_rowscn) dans une variable. Chaque fois que notre application va insérer, mettre à jour ou supprimer un enregistrement, il obtiendra une nouvelle max de la base de données. Si la valeur est différente alors il sait évidemment il a besoin d'aller chercher une nouvelle liste de la base de données.

Alors, ma question réelle est la suivante:? Y at-il d'autres accrocs je devrais être au courant qui pourrait se traduire par une insertion, mise à jour ou la suppression d'un enregistrement non incrémenter cette valeur

Modifier: quelqu'un add Can ora_rowscn comme une balise

Était-ce utile?

La solution

  

Y at-il d'autres accrocs que je devrais être au courant de ce résultat pourrait dans un   insérer, mettre à jour ou la suppression d'un enregistrement n'incrémenter cette valeur?

ora_rowscn est toujours incrémentée lors d'un changement de ligne - mais dans une configuration par défaut, il peut également être incrémentée lorsqu'une ligne ne change pas

Si vous devez vérifier toute la table pour udates, une méthode consiste à utiliser l'audit . D'autre part, si vous avez seulement besoin de vérifier la ligne que vous essayez de mise à jour des conflits, ora_rowscn avec rowdependencies est idéal.

Autres conseils

Obtenir le maximum (ora_rowscn) nécessitera une table analyse complète chaque fois que vous le faites. Il peut être plus rapide pour rafraîchir chaque fois que l'ensemble du cache.

On dirait que vous avez besoin d'un moyen d'informer l'autre service qu'un changement a eu lieu et ce que le changement a été. Vous pouvez maintenir une table de journal avec une colonne qui indique que le système a besoin de consommer le changement. La colonne pourrait avoir deux indices à base de fonction un pour chaque service afin que chaque index contient uniquement les entrées qui doivent être consommés. Puis, comme ils sont consommés, ils peuvent faire la valeur NULL pour le supprimer de l'index.

Ou vous pouvez simplement utiliser Advanced Queuing .

Comme @Leigh Riffel a noté, une sélection max (ora_rowscn) se traduira par une analyse complète de la table. Une alternative est d'avoir une colonne d'horodatage (nous appellerons sys_ts pour cet exemple) qui est peuplée au moment de l'exécution de l'instruction (qui ne soit pas la même que l'engagement de la déclaration, qui est lorsque le scn est généré / population). Un index sur la colonne sys_ts vous permettra de regarder les plus récentes x (disons 25) lignes pour trouver les ora_rowscn max seulement de ces lignes.

La voie la plus directe pour ce faire serait d'utiliser la rownum aux résultats limites décrites dans la présente [1] demander article tom:

select *
from (select sys_ts, ora_rowscn
from table order by SYS_TS desc) where rownum < 25;

Malheureusement, cela se traduit également par une analyse complète de la table (au moins dans l'oracle 11.2.0.3). Cela a été rapporté à Oracle, mais déterminé à ne pas être un défaut (bug 17347125).

Cela nécessite un peu plus de travail pour atteindre efficacement le même résultat:

select b.sys_ts,b.ora_rowscn from
    (select rid from 
        (select rowid as rid from table order by sys_ts desc) 
    where rownum <= 25) a, table b
where a.rid = b.rowid;

[1] - http: // www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top