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

SQL Oracle Discussion :

Vérifier les contraintes avant un commit


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Par défaut Vérifier les contraintes avant un commit
    Bonjour ,

    Je dois supprimer un grand nombre de données sur une table dont la clé primaire est ultilisée dans de nombreuse autre tables en tant que clé étrangère.
    Pour des raisons de performances afin de gagner du temps je suis obligé de désactiver les contraintes pour faire mon delete. Mais le problème c'est que ensuite je dois de nouveau insérer des données (il n'y a pas de commit entre les deux) puis faire un commit avant de pouvoir reactiver des contraintes.
    Ce scénario n'est pas génant si je suis sur des données que je supprime et que j'insère. Mais si je supprime ou insère une mauvaise donnée, je ne peux plus reactiver les contraintes et je ne peux pas me permettre cela.

    J'ai essayé de réactiver les contraintes avant le commit mais j'ai une erreur Oracle "NOWAIT specified".

    Afin d'éviter ce scénario (ne pas pouvoir reactiver les contraintes) que puis-je faire?
    1. coder moi meme un algo qui vérifie que toutes les données sont bonnes avant de faire le commit.
    2. Existe-t-il une fonction Oracle/SQL qui vérifie l'intégrité des données?
    3. autre solutions?

    Merci d'avance.

    PS je travaille sur Oracle 10g sur un serveur linux.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    C'est clair que tu ne peux pas réactiver les contraintes en cours de transaction vu que c'est du DDL.

    Faut que tu vérifies avant que tes données supprimées et insérées soient correctes ou que tu fasses une boucle de suppression et d'insertion qui en cas d'erreur fait un log et continue le traitement.

    Tout dépend de tes contraintes de développement

  3. #3
    Membre confirmé Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Par défaut
    Merci McM, parce que je me demandais : avant de reactiver les contraintes, Oracle les vérifies (et refuse de les reactiver si elles sont violées), n'est il pas possible d'executer juste cette vérification sans reactiver la contrainte? A ce moment la je peux vérifier avant le commit et faire un rollback si nécessaire.

    Merci.

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    au lieu de désactiver les contraintes, il serait plus simple de les déférer

    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
    SQL> create table lsc_t(x number constraint lsc_t_pk primary key deferrable initially deferred);
     
    Table created.
     
    SQL> set constraints all deferred;
     
    Constraint set.
     
    SQL> insert into lsc_t(x) values (1);
     
    1 row created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> set constraints all deferred;
     
    Constraint set.
     
    SQL> select * from lsc_t;
     
             X
    ----------
             1
     
    SQL> insert into lsc_t(x) values (2);
     
    1 row created.
     
    SQL> insert into lsc_t(x) values (3);
     
    1 row created.
     
    SQL> insert into lsc_t(x) values (3);
     
    1 row created.
     
    SQL> commit;
    commit
    *
    ERROR at line 1:
    ORA-02091: transaction rolled back
    ORA-00001: unique constraint (TGPOWNER.LSC_T_PK) violated
     
     
    SQL> select * from lsc_t;
     
             X
    ----------
             1

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut

    Voila une commande que j'ai du voir une fois dans les docs il y a longtemps..
    Comme quoi, on en apprend tous les jours.

    Merci Laurent et désolé Bankette d'avoir mal répondu.

  6. #6
    Membre confirmé Avatar de bankette
    Homme Profil pro
    Chef de Projet Web
    Inscrit en
    Mars 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de Projet Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 135
    Par défaut
    Yes merci beaucoup !!!
    Et au niveau temps d'éxecution on y gagne par rapport aux contraintes non différées?
    Et doit on executer la requete a chaque fois? Ou bien faut il la désactiver apres avoir fais le commit?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/07/2010, 19h19
  2. Vérifier les données avant de les insérer
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2009, 22h31
  3. [Hook] Tester les script PHP avant chaque commit
    Par jojolapin972 dans le forum Subversion
    Réponses: 0
    Dernier message: 26/02/2009, 09h24
  4. Vérifier les dimensions d'une image avant d'uploader
    Par aliwassem dans le forum Langage
    Réponses: 6
    Dernier message: 31/05/2008, 12h30
  5. [Formulaire] vérifier les champs avant enregistrement
    Par julien_t_m dans le forum Access
    Réponses: 5
    Dernier message: 16/10/2005, 20h53

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