|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() |
Bonjour,
J'ai une procédure pl/sql qui s'articule comme suit : 1/ Désactive les FK d'un jeu de tables 2/ Execution d'opérations DML 3/ Réactivation des FK du jeu de table Mon besoin : Lorsque la réactivation déconne (point 3), je souhaite rollback le DML Mon problème A. Le DDL commit illico donc impossible B. La mise en place d'une PRAGMA AUTONOMOUS_TRANSACTION dans la procédure de réactivation des contraintes implique un deadlock car la table dont la contrainte doit être réactivée est verrouillée sous la main transaction Ma question Comment feriez-vous pour tester si la contrainte peut être réactivée ? Si vous avez d'autres suggestions, n'hésitez pas. Bonne journée, Seb |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Je peux imaginer deux axes d’actions
Ensuite plusieurs solutions sont envisageable au moins pour le cas b) vues matérialisés, trigger d’audit, colonne timestamp, etc. Pour a) il faut étudier la faisabilité en fonction de besoins. |
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Tu peux pas faire un VALIDATE sur la contrainte dans une autre session ?
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() |
Je ne sais pas comment seulement valider une contrainte, c'est à dire sans exécuter d'opération DLL commitante ...
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Inscription : septembre 2004 Messages : 2 942 ![]() |
Mis à part faire manuellement les select de vérifications des FK...
(par contre, pour les perfs, c'est la mort !) Mais une table d'exceptions (http://download.oracle.com/docs/cd/B...eral.htm#13282) ne pourrait-elle pas convenir ? |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() |
Super cet article ! Je m'y attache dès demain matin et vous tiens au courant.
Merci pour le coup de main, Seb |
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
La table d'exception va enregistrer seulement les exceptions
Est-il acceptable de garder les données incohérentes ainsi chargée et les résoudre plus tard ? Pourriez-vous mieux préciser vos besoins ? |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() |
errrr :-(
J'avais au départ créé une réponse pour dire que j'avais déjà essayé, puis en parcourant l'article cité j'ai cru (à tord) qu'il s'agissait d'une solution sans ré enable des contraintes. La solution de la table d'exceptions ne convient pas, car elle passe par un "alter table" qui est d'ordre DDL, qui commit donc tout DML précédent. Pour répondre à mnitu, le use case est assez classique ( Je pourrais effectivement faire un algorithme de calcul et d'ordonnancement des tables de façon à ne pas avoir à désactiver les contraintes, mais je me demande si dans l'absolu il ne serait pas possible de tomber sur un cas insolvable. A+ merci de votre aide |
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
1°) qu'est ce qui pourrait expliquer que la contrainte est KO dans la cible si c'est OK dans la source
2°) pourquoi ne pas utiliser la réplication Oracle ? 3°) aurais-tu un exemple de code à nous proposer pour mieux comprendre le process ? |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
J'au du mal à comprendre le besoin. D'abord pourquoi ne pas laisser les contraintes activées ? Quel est le message d'erreur complet que vous avez si les contraintes restes activées ? Un exemple (avec le DDL complet des contraintes) serait le bienvenu
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() |
Bonjour,
Je sais que si source est ok, dest le sera. Mais étant donné la criticité je préfère (au cas où il se passerait n'importe quoi ... par expérience, je ne peux pas tout prévoir La réplication oracle ? Il faut que je regarde ce que c'est ... Mais à mon avis cela ne conviendra pas, car je fais également un select en source sur une colonne qui peut avoir pour valeur "delete", ce qui implique le cas échéant un delete dml en dest. Cela, à mon avis, Oracle ne le prévoit pas nativement. A propos du code, je ne peux pas trop coller ça ici car cela fait 5-6 pages en wide screen alors vous imaginez en pages de forum ! |
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() |
Bon en liquidant l'inutile, voilà ce que ça donne :
Code :
|
||
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Si vous construisez votre propre système de réplication, il faut être sûr qu'il applique les instructions SQL exactement comme sur la base source:
Difficile de dire si ses conditions sont remplies si vous avez du code générique. Quels sont les critères d'ordonnancement des instructions SQL ? |
|
|
00
|
|
|
#14 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
heureusement quand même Oracle prend en charge tous les DML et même le DDL Tu peux même gérer les conflits
|
|
|
|
00
|
|
|
#15 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Tu réinventes la roue là... non seulement c'est pas évident (comme tu le vois
Quelle version d'Oracle tu as ? Edit : 9i j'avais pas vu Enfin, réinventer la standby logique c'est un peu lourd
|
|
|
00
|
|
|
#16 | |
|
Membre Expert
![]() |
Citation:
Je ne suis pas certain de comprendre ce que vous entendez par "transaction sur la base source" Il ne s'agit pas une réplication à la volée, mais batch. Il n'y a aucune transaction explicitement ouverte sur la base source car il n'y a que des selects. Les ordres DML sont construits table par table, pour chacune il y a un DELETE et un MERGE INTO avec clauses WHEN MATCHED + WHEN NOT MATCHED. Les tables dest sont (seront : en cours d'implémentation) totues lockées (exclusive) par le batch. Je ne me suis pas soucié de la question d'ordre du DML, car j'ai opté pour la solution de désactivation des contraintes. Pourriez-vous préciser ce à quoi vous faites allusion ? Merci de vous pencher sur mon cas Seb Note : je viens de m'apercevoir que j'ai dit une ânerie dans mon dernier post, il s'agit bien d'une réplication bête et méchante ... (c'est ça de faire plusieurs procédures en même temps) Je me penche donc sur la fonctionnalité de réplication d'oracle. |
|
|
|
00
|
|
|
#17 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
c'est dommage, STREAMS en 10g fonctionne super bien... en 9i, il parait que c'est plus capricieux
|
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() |
je viens de jeter un oeil sur la réplication, mais ça m'a l'air d'être une sacré usine à gaz pour ce que je veux faire ...
Moi j'appuie sur un bouton dans le soft fait en VB, et le contenu des tables de user 1 sont copiées dans celles de user 2 user 2 n'est JAMAIS modifié, c'est forward only ... Donc les conflits et tout le bazar c'est pas mon problème. Ensuite pour la lenteur, d'une part nos volumétries sont raisonnables donc le problème ne se pose pas (trop), d'autre part en ce qui concerne le delete uniquement je suis effectivement confronté à des perfs médiocres (jointure entre big tables pour savoir ce qui manque) mais j'ai un workaround de derrière les faggots. Dès que j'ai le temps je regarde en détail la réplication sous 9i |
|
|
00
|
|
|
#19 | ||
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
![]() Citation:
Si tu ne géres pas les conflits la réplication est extrêment simple... le concept est un peu délicat à appréhender mais la mise en oeuvre est d'une simplicité enfantine |
||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() |
MV = mat view ?
Les modèles sont un peu différents, et on a vraiment une organisation désynchronisée : la réplication se fait à la demande, en temps voulu ... En fait je suis en train de brancher mon produit sur un autre produit du client, donc on ne doit pas toucher un poil de leur modèle / organisation (ce qui est normal) Donc à mon avis les mat view sont inenvisageables. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com