IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

[9i pl/sql] Tester une contrainte de clé étrangère avant son activation [Hors sujet]


Sujet :

PL/SQL Oracle

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut [9i pl/sql] Tester une contrainte de clé étrangère avant son activation
    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

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je peux imaginer deux axes d’actions
    1. ne pas désactiver les contraintes
    2. enregistrer les modifications DML pour faire un « rollback » fonctionnel
      (suppression par delete des enregistrements ajoutés)


    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.

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Tu peux pas faire un VALIDATE sur la contrainte dans une autre session ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Je ne sais pas comment seulement valider une contrainte, c'est à dire sans exécuter d'opération DLL commitante ...

  5. #5
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    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 ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Super cet article ! Je m'y attache dès demain matin et vous tiens au courant.

    Merci pour le coup de main,
    Seb

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    La table d'exception va enregistrer seulement les exceptions donc je ne vois pas comment ensuite on pourrait faire le «*rollback*».

    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 ?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    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 (), car il s'agit d'une réplication des tables de dev vers préprod. Le mode opératoire ne l'est pas moins : disable all constraints, for each table, merge into ... enable constraints.

    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

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    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 ?

  10. #10
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    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

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    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 ) mettre en place un garde fou.

    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 !

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Bon en liquidant l'inutile, voilà ce que ça donne :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    CREATE OR REPLACE PROCEDURE APPLYCHANGES(I_strSourceSchema IN VARCHAR2,I_strDestSchema IN VARCHAR2)
    AS
        [...] Déclaration des curseurs etc.          
    BEGIN       
        -- Init :
        j := 0;
     
        -- ******* Disable all triggers & foreign keys :
        -- je tape dans ALL_constraints etc. puis je build/exécute le ddl dans cette fonction :
     
        ENABLE_TABLES_FK_AND_TRIGGERS(0,I_strDestSchema);
     
        SELECT t.table_name BULK COLLECT INTO colTables FROM all_tables t
        WHERE t.owner = I_strSourceSchema    
        AND ...
     
        FOR i IN colTables.FIRST..colTables.LAST LOOP 
            strTableName := colTables(i);
     
            strInsertSubQuery_D := '';
            strInsertSubQuery_S := '';
     
            -- 1st, make a massive update/insert using the MERGE INTO statement
            -- 2nd, delete the elements removed from intermediate model by, for instance, a baseline restore
     
            strDeleteQuery := 'DELETE FROM ' || I_strDestSchema || '.' || strTableName || ' d WHERE (';
     
            strQuery := 'MERGE INTO ' || I_strDestSchema || '.' || strTableName || ' d ' ||
                        'USING (SELECT ';        
     
            -- [...] Compilation de la requêtes
     
            -- DML execution started : :        
            j := 1;
            EXECUTE IMMEDIATE strDeleteQuery;
            EXECUTE IMMEDIATE strQuery;               
     
        END LOOP; 
     
        j := 2;
     
        -- ******* Re-enable all triggers & foreign keys :
        ENABLE_TABLES_FK_AND_TRIGGERS(1,I_strDestSchema);    
     
    EXCEPTION
        WHEN OTHERS THEN
            IF j = 1 THEN
                ROLLBACK;
            ELSIF j = 2 THEN
                RAISE_APPLICATION_ERROR(-20001,'Erreur lors de la réactivation des contraintes + triggers, vérifiez l''intégrité de la base destination de la réplication');
            ELSE
                RAISE; 
            END IF;
    END;
    /
    ps : soyez indulgents j'ai du apprendre le pl/sql sur le tas pour faire des proc stocks de ce genre ..

  13. #13
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    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:
    • il faut que la transaction n°2 soit exécutée après la transaction n°1 et avant la transaction n°3
    • il faut que l'ordre des instructions SQL dans chaque transaction soit conservé
    • il faut que que chaque instruction qui modifie les données (INSERT, UPDATE, DELETE) dans une transaction sur la base source fasse effectivement partie de la transaction sur la base cible.


    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 ?

  14. #14
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par Vld44 Voir le message
    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.
    Bien sûr que si

    heureusement quand même

    Oracle prend en charge tous les DML et même le DDL

    Tu peux même gérer les conflits

  15. #15
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par Vld44 Voir le message
    Bon en liquidant l'inutile, voilà ce que ça donne
    Tu réinventes la roue là... non seulement c'est pas évident (comme tu le vois ) mais en plus ce sera terriblement lent

    Quelle version d'Oracle tu as ?

    Edit : 9i j'avais pas vu

    Enfin, réinventer la standby logique c'est un peu lourd Bon courage

  16. #16
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par pifor Voir le message
    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:
    • il faut que la transaction n°2 soit exécutée après la transaction n°1 et avant la transaction n°3
    • il faut que l'ordre des instructions SQL dans chaque transaction soit conservé
    • il faut que que chaque instruction qui modifie les données (INSERT, UPDATE, DELETE) dans une transaction sur la base source fasse effectivement partie de la transaction sur la base cible.


    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 ?
    Bonjour,

    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.

  17. #17
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est dommage, STREAMS en 10g fonctionne super bien... en 9i, il parait que c'est plus capricieux

  18. #18
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    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

  19. #19
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par Vld44 Voir le message
    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
    Sauf que ça ne marche pas pour le moment a priori

    Citation Envoyé par Vld44 Voir le message
    user 2 n'est JAMAIS modifié, c'est forward only ... Donc les conflits et tout le bazar c'est pas mon problème.
    Et des MV ça ne conviendrait pas ?

    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

  20. #20
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    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.

Discussions similaires

  1. [11gR2] Sur quelle table porte une contrainte de clé étrangère ?
    Par CinePhil dans le forum SQL
    Réponses: 2
    Dernier message: 27/02/2015, 11h09
  2. Ajouter une contrainte de clé étrangère
    Par cedrix57 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/12/2009, 03h35
  3. Réponses: 29
    Dernier message: 25/11/2007, 16h08
  4. Réponses: 5
    Dernier message: 28/04/2006, 11h55
  5. [SQL] desactiver une contrainte de clé primaire puis l'a reactive
    Par SanTa62 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/01/2006, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo