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

Requêtes PostgreSQL Discussion :

Création d'un domaine avec vérification d'email


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2016
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2016
    Messages : 67
    Points : 90
    Points
    90
    Par défaut Création d'un domaine avec vérification d'email
    Bonjour,

    Lors de la création d'une base, je dois créer un domaine incluant la vérification de la syntaxe d'une adresse mail.
    Je pensais partir sur l'expression suivante, trouvée sur Internet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])')
    J'ai donc la déclaration suivante pour la création du domaine, sous Postgresql 9.6 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE DOMAIN EMAIL_D
    AS VARCHAR(255)
    CONSTRAINT EMAIL_D_CK CHECK (VALUE IS NOT NULL AND VALUE = LOWER(VALUE) AND	VALUE ~* '(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])');
    Lors de l'exécution du script, PgAdmin renâcle et me renvoie une erreur de syntaxe.
    Je pense que dois mettre quelques caractères d'échappement dans l'expression mais, pour le moment, tous mes essais ont été infructueux ; PgAdmin m'a systématiquement renvoyé une erreur de syntaxe.
    Là, je sèche un peu...

    Pouvez-vous m'aider ?

    Deux remarques :
    - Je ne souhaite pas déléguer la validation syntaxique au programme d'accès à la base. Une base de données doit se suffire à elle-même et assurer la cohérence des données sans qu'il ne soit nécessaire de faire appel à une bibliothèque tierce. En plus, les SGBDR comme Postgresql sont capables de le faire.
    - Je pourrai réduire l'expression mais j'ai peur qu'une expression trop simpliste laisse passer des exceptions.

    Vincent

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par aras-vbo Voir le message
    Pouvez-vous m'aider ?
    Bonjour

    Il te faut protéger les quottes simples situées dans l'expression. Et on protège une quotte simple en la doublant.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE DOMAIN EMAIL_D AS VARCHAR(255)
    CONSTRAINT EMAIL_D_CK CHECK (VALUE IS NOT NULL AND VALUE = LOWER(VALUE) AND	VALUE ~* '(?:[a-z0-9!#$%&''*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])');
    (j'ai mis en gros rouge non pas pour te critiquer mais pour que tu voies bien les modifs).
    Ceci dit, je ne pige rien à ta regex. Moi, j'aurais dit qu'un email c'était des lettres et des chiffres avec éventuellement un tiret ou underscore suivi d'un @ suivi de lettres. De plus je ne cautionne pas le "value=lower(value)". Pour moi, un email peut contenir des majuscules.

    Citation Envoyé par aras-vbo Voir le message
    Je ne souhaite pas déléguer la validation syntaxique au programme d'accès à la base. Une base de données doit se suffire à elle-même et assurer la cohérence des données sans qu'il ne soit nécessaire de faire appel à une bibliothèque tierce.
    Oui, c'est légitime. C'est ce que je fais aussi. Tous mes "insert/update" passent systématiquement par des triggers qui checkent tout ce qu'ils peuvent.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui, c'est légitime. C'est ce que je fais aussi. Tous mes "insert/update" passent systématiquement par des triggers qui checkent tout ce qu'ils peuvent.
    Ce serait mieux que ce soit des contraintes CHECK plutôt que des déclencheurs :
    1) le code est en C compilé dans les contraintes tandis que c'est de l'interprété dans le déclencheur
    2) les déclencheurs PostgreSQL ne sont pas ensembliste, alors que CHECK associé à une UDF peut l'être.

    Donc les performances seraient nettement meilleures, surtout que tant que le code n'est pas déroulé, l'objet est en verrouillage exclusif.

    A +

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ce serait mieux que ce soit des contraintes CHECK plutôt que des déclencheurs
    Je comprends ton point de vue. Et tu as raison bien entendu (j'ai aussi des check autant que je peux) mais tu ne sais pas tout (la faute m'en incombre car j'ai un peut trop élagué).
    Mes triggers essayent aussi de corriger ce qui entre autant que faire se peut. Si par exemple j'ai deux colonnes min et max dans une table alors le trigger correspondant à cette table checkera les deux valeurs et si elles sont inversées, il les remet dans le bon sens. Si par exemple j'ai un champ "commentaire" alors le trigger fera un trim() de ce qui entre, et si après le trim() il ne reste plus rien, alors il remplace le texte par "NULL" (ex: new."commentaire"=nullif(trim(both ' ' from new."commentaire"), '');). J'ai aussi des dates de création. Dans ce cas, si la date entrée est supérieure au jour système, alors c'est le jour système qui est pris à sa place. Bref j'essaye de corriger ce qui entre quand c'est corrigeable...

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je comprends ton point de vue. Et tu as raison bien entendu (j'ai aussi des check autant que je peux) mais tu ne sais pas tout (la faute m'en incombre car j'ai un peut trop élagué).
    Mes triggers essayent aussi de corriger ce qui entre autant que faire se peut.
    OK, je comprends...

    Si par exemple j'ai deux colonnes min et max dans une table alors le trigger correspondant à cette table checkera les deux valeurs et si elles sont inversées, il les remet dans le bon sens.
    Par d'accord du tout, cela peut être une faute de frappe


    Si par exemple j'ai un champ "commentaire" alors le trigger fera un trim() de ce qui entre, et si après le trim() il ne reste plus rien, alors il remplace le texte par "NULL" (ex: new."commentaire"=nullif(trim(both ' ' from new."commentaire"), '');).
    Pour les commentaire je met toujours du XML avec en sus, la dateheure et l'auteur et aucune possibilité de supprimer les entrées...

    J'ai aussi des dates de création. Dans ce cas, si la date entrée est supérieure au jour système, alors c'est le jour système qui est pris à sa place. Bref j'essaye de corriger ce qui entre quand c'est corrigeable...
    Oui, bof....

    A +

Discussions similaires

  1. Création d'un formulaire avec vérification JavaScript
    Par Miamoto dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/12/2008, 14h51
  2. Réponses: 2
    Dernier message: 27/07/2004, 14h38
  3. [Débutante] Création d'une image avec un composant
    Par gwendo dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 09/07/2004, 09h58
  4. création base de données avec easyphp
    Par Battosaiii dans le forum Débuter
    Réponses: 5
    Dernier message: 29/06/2004, 18h50
  5. Création d'une base avec IbConsole
    Par Lucien dans le forum Outils
    Réponses: 3
    Dernier message: 02/03/2004, 18h34

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