2011-10-01 3 views
2

J'utilise Oracle 11g, et en essayant de créer une table définir des contraintes sur la création.Oracle 11g - Vérifier la contrainte avec RegEx

Je tentais d'ajouter contrainte de vérification pour valider certaines informations (telles que l'adresse e-mail, numéro de téléphone, etc ...)

Y at-il quelque chose dans Oracle 11g qui me permettrait de faire quelque chose comme ça?

constraint CK_CONSTRAINT_NAME check (EMAIL like 'REGEX') 

Le regex que je voulais utiliser (de regexLib attrapé) est:

^[a-zA-Z][a-zA-Z0-9_\.\-][email protected]([a-zA-Z0-9-]{2,}\.)+([a-zA-Z]{2,4}|[a-zA-Z]{2}\.[a-zA-Z]{2})$ 

Je pense que Oracle 11g (corrigez-moi si je me trompe) ne prend pas en charge ce format pour RegEx ..

J'ai vu des méthodes utilisant REGEX_LIKE, mais il semble ne fonctionner que dans les clauses WHERE. Je voudrais le garder comme une contrainte de vérification et non comme un déclencheur ou une fonction/script externe.

En outre, j'ai lu dans d'autres threads ici, quelqu'un disant RegEx 'ne sont pas un bon moyen de vérifier le format de l'adresse e-mail et de telles informations. Aucune raison n'a été donnée dans le commentaire, et j'aimerais savoir pourquoi, s'il y a une raison!

+3

Ce regex devrait être sorti et tiré. J'espère que ce n'est pas vraiment comme ça sur RegexLib. "' 'alum'"? Des quantificateurs inutiles? Ponctuation manquante? En dehors de cela, regex n'est pas bon pour la validation des adresses e-mail car le format est trop variable pour une regex fiable (vous perdrez toujours les mails valides et accepterez les mails invalides). Le mieux que vous puissiez faire est de vérifier la présence d'un signe '@' et d'essayer de lui envoyer un message de confirmation. Si cela réussit, et si vous recevez un mail de retour, vous savez que l'adresse est valide et active. –

+0

@TimPietzcker Désolé, j'ai changé le regEx pour le vrai, c'était une sorte de mash up de l'original et quelque chose que j'ai essayé à partir de la documentation Oracle. – Pacane

Répondre

11

Une contrainte de vérification suit les mêmes règles de syntaxe que les conditions pour une clause WHERE:

alter table foo 
    add constraint check_email 
    check (REGEXP_LIKE(email,'your_regex_goes_here','I')); 

Plus de détails dans le manuel:

Edit:

Il y a cependant quelques restrictions sur ce que vous pouvez réellement utiliser dans une contrainte de vérification:

+0

Peut-être que vous pouvez me dire, j'ai essayé ceci: "alter table JOURNALISTE ajouter une contrainte check_email vérifier (REPEXP_LIKE (COURR_JOUR, '^ [a-zA-Z] [a-zA-Z0-9 _ \. \ -] + @ ([a-zA-Z0-9 -] {2,} \.) + ([a-zA-Z] {2,4} | [a-zA-Z] {2} \. [a-zA -Z] {2}) $ ',' I ')) "et je n'arrive toujours pas à entrer une adresse e-mail valide dans une instruction d'insertion. J'ai pris ce RegEX sur regEx lib, mais je ne suis pas sûr qu'il soit supporté par Oracle.J'ai lu quelques parties de la documentation sur regEX et il ne semblait pas utiliser cette norme pour les nombres, il semblait utiliser quelque chose comme: num ou quelque chose de similaire ... – Pacane

+0

Il n'est pas tout à fait vrai que "** n'importe quoi * * qui peut être utilisé dans une condition WHERE peut être utilisé dans une contrainte de vérification. " Par exemple, une contrainte de vérification ne peut pas faire référence à des colonnes dans d'autres tables, ne peut pas appeler des fonctions qui ne sont pas déterministes et ne peut pas appeler des fonctions définies par l'utilisateur. Voir [Restrictions sur les contraintes de vérification] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/clauses002.htm#i78179) [** 11g Release 2 (11.2) **]. – DavidRR

+0

@DavidRR: bon point, merci. Je parlais de la syntaxe, plutôt que des expressions réelles. J'ai clarifié mon message. –