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 :

Ajout d'une contrainte de validation des données complexes


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut Ajout d'une contrainte de validation des données complexes
    Bonjour,

    J'aimerais bien avoir votre support concernant le problème suivant, en fait je souhaite interdire à l'utilisateur d'insérer un enregistrement s'il est déjà existant,comme pourrais je l'implémenter dans oracle ?

    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
    SELECT COUNT(*)
      INTO nombre
      FROM test_table
      WHERE ((from <= valeur_ecran.from
        AND   until >= valeur_ecran.from)
      OR     (from <= valeur_ecran.until
        AND   until >= valeur_ecran.until)
      OR     (from >= valeur_ecran.from
        AND   until <= valeur_ecran.until))
      AND     sens   = valeur_ecran.sens
      AND     ROWNUM        = 1;
     
      IF nombre <> 0 THEN
        //la contrainte doit se lever car l'enregistrement est déjà existant dans la table
      END IF;
    Merci d'avance.

    En attente de votre feedback.
    Demain n'est plus à attendre mais à inventer !!!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    S'agit-il de déclencher une exception ou d'empêcher l'insertion ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    S'agit-il de déclencher une exception ou d'empêcher l'insertion ?
    Bonjour,

    Empêcher l'insertion.

    Merci
    Demain n'est plus à attendre mais à inventer !!!

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Une requête de ce style :
    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
    INSERT INTO test_table("from", "until", sens)
    SELECT  "from"
        ,   "until"
        ,   sens 
    FROM    valeur_ecran    dat
    WHERE   NOT EXISTS
            (   SELECT  NULL
                FROM    test_table  tst
                WHERE   dat."from"  BETWEEN tst."until" AND tst."from"
                    OR  dat."until" BETWEEN tst."until" AND tst."from"  
                    OR  (   dat."from"   <= tst."from" 
                        AND dat."until"  >= tst."until"
                        )
                    AND dat.sens   = tst.sens
            )
    ;
    Attention ! FROM et UNTIL sont des mots réservés du langage SQL et ne devraient pas être utilisés pour nommer un objet de la base.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Une requête de ce style :
    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
    INSERT INTO test_table("from", "until", sens)
    SELECT  "from"
        ,   "until"
        ,   sens 
    FROM    valeur_ecran    dat
    WHERE   NOT EXISTS
            (   SELECT  NULL
                FROM    test_table  tst
                WHERE   dat."from"  BETWEEN tst."until" AND tst."from"
                    OR  dat."until" BETWEEN tst."until" AND tst."from"  
                    OR  (   dat."from"   <= tst."from" 
                        AND dat."until"  >= tst."until"
                        )
                    AND dat.sens   = tst.sens
            )
    ;
    Attention ! FROM et UNTIL sont des mots réservés du langage SQL et ne devraient pas être utilisés pour nommer un objet de la base.
    Bonjour Alain,

    Je pense que j'ai mal exprimé mon besoin je veux empêcher la saisie et lever une exception (contrainte) si la valeur du champ nombre est != 0

    je fais référence à la contrainte de validation des données de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER TABLE test_table ADD (
      CONSTRAINT Valeur_Exsistante
     CHECK (xxxxxxx);
    En attente de ton feedback.

    Merci d'avance.
    Demain n'est plus à attendre mais à inventer !!!

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Tu as en effet clairement mal exprimé ton besoin.

    Citation Envoyé par al1_24
    S'agit-il de déclencher une exception ou d'empêcher l'insertion ?
    Bonjour,

    Empêcher l'insertion.

    Merci
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Tu as en effet clairement mal exprimé ton besoin.
    Désolé
    Demain n'est plus à attendre mais à inventer !!!

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous essayez en réalité d'effectuer un contrôle multi-lignes, qu'on présente sous la forme d'assertion en langage normatif mais qui ne sont pas implémentées dans les SGBD tenors du marché.

    Il s'agit d'un besoin un peu plus complexe qu'il n'y parait car il n'y a pas toujours un seul utilisateur simultané.
    Un exemple : un premier utilisateur vérifie une disponibilité qui est OK, la réserve mais sans validation (en temps de traitement machine).
    Un deuxième vérifie la même disponibilité qui sera OK puisque le premier n'a pas validé. Vous allez vous retrouver avec des doublons (au pire) car la vérification a été juste dans les deux cas.

    Pour contourner ce problème, vous avez un premier moyen qui est simple, passez votre transaction en mode SERIALIZABLE : ça empêche toute modification pendant qu'une transaction est ouverte.
    C'est une solution applicable si et uniquement si vous avez un nombre faible d'utilisateurs en simultané.

    Si non, il faut vous tourner vers une autre modélisation et jouer avec des contraintes d'unicité. Dans ce cas il faut mieux détailler votre besoin si vous voulez un coup de main.

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous essayez en réalité d'effectuer un contrôle multi-lignes, qu'on présente sous la forme d'assertion en langage normatif mais qui ne sont pas implémentées dans les SGBD tenors du marché.

    Il s'agit d'un besoin un peu plus complexe qu'il n'y parait car il n'y a pas toujours un seul utilisateur simultané.
    Un exemple : un premier utilisateur vérifie une disponibilité qui est OK, la réserve mais sans validation (en temps de traitement machine).
    Un deuxième vérifie la même disponibilité qui sera OK puisque le premier n'a pas validé. Vous allez vous retrouver avec des doublons (au pire) car la vérification a été juste dans les deux cas.

    Pour contourner ce problème, vous avez un premier moyen qui est simple, passez votre transaction en mode SERIALIZABLE : ça empêche toute modification pendant qu'une transaction est ouverte.
    C'est une solution applicable si et uniquement si vous avez un nombre faible d'utilisateurs en simultané.

    Si non, il faut vous tourner vers une autre modélisation et jouer avec des contraintes d'unicité. Dans ce cas il faut mieux détailler votre besoin si vous voulez un coup de main.
    Merci.

    Le contrôle est tout à fait faisable via implémentation software.

    mais je ne veux pas toucher mes process (car ils nécessiteront des tests de non régression trop complexe).

    j'ai pensé à implémenter mon contrôle via la contrainte de validation de données mais je ne sais pas est ce que c'est possible ou pas ?
    Demain n'est plus à attendre mais à inventer !!!

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Le contrôle peut être placé dans un trigger before insert.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Le contrôle peut être placé dans un trigger before insert.
    merci alain.

    peut tu stp m'expliquer comment ? merci
    Demain n'est plus à attendre mais à inventer !!!

Discussions similaires

  1. Validation des données d'une texte Box
    Par eric4459 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/11/2014, 16h36
  2. Réponses: 1
    Dernier message: 16/06/2014, 09h22
  3. Réponses: 3
    Dernier message: 17/07/2012, 14h31
  4. Validation des données d'une Map
    Par thewarlock dans le forum Struts 2
    Réponses: 1
    Dernier message: 03/09/2010, 08h50
  5. Réponses: 10
    Dernier message: 11/11/2007, 15h18

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