Voici un petit snippet pour vérifier la validité d’une adresse mail, histoire d’assurer un minimum d’intégrité à l’aide d’une contrainte de domaine vérifiée par cette fonction :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ------------------------------- -- Nicolas SOUQUET - 09/11/2009 ------------------------------- CREATE FUNCTION Fn_CheckMail (@_mail VARCHAR(320)) RETURNS BIT WITH SCHEMABINDING AS BEGIN RETURN CASE WHEN CHARINDEX(' ', LTRIM(RTRIM(@_mail))) = 0 -- Pas d'espaces AND LEFT(LTRIM(@_mail), 1) '@' -- '@' ne peut pas être le premier caractère de l'adresse AND RIGHT(RTRIM(@_mail), 1) '.' -- '.' ne peut pas être le dernier caractère de l'adresse AND LEN(LTRIM(RTRIM(@_mail))) - LEN(REPLACE(LTRIM(RTRIM(@_mail)), '@', '')) = 1 -- Un seul '@' AND CHARINDEX('.', @_mail, CHARINDEX('@', @_mail)) - CHARINDEX('@', @_mail) > 1 -- Il doit y avoir un '.' après l'@ AND CHARINDEX('.', REVERSE(LTRIM(RTRIM(@_mail)))) >= 3 -- le nom de domaine doit se terminer avec au moins 2 caractères AND CHARINDEX('.@', @_mail) = 0 -- pas de '.@' AND CHARINDEX('..', @_mail) = 0 -- pas de '..' AND LEN(LEFT(@_mail, CHARINDEX('@', @_mail) - 1)) <= 64 -- la partie locale ne peut excéder 64 caractères AND LEN(RIGHT(@_mail, LEN(@_mail) - CHARINDEX('@', @_mail))) <= 250 -- la partie nom de domaine ne peut excéder 250 caractères THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END END |
Et voici comment ajouter la contrainte à la table-exemple suivante :
1 2 3 4 5 6 7 8 9 10 11 | CREATE TABLE TbClient ( IDClient INT NOT NULL CONSTRAINT PK_TbClient PRIMARY KEY, NumeroClient INT NOT NULL CONSTRAINT UQ_TbClient_NumeroClient UNIQUE, NomClient VARCHAR(32) NOT NULL, PrenomClient VARCHAR(32) NOT NULL, mailClient VARCHAR(320) NOT NULL ) ALTER TABLE dbo.TbClient ADD CONSTRAINT CHK_TbClient_mailClient CHECK (dbo.Fn_CheckMail(mailClient) = 1) |
ElSuket
Merci beaucoup Oluha, c’est maintenant corrigé.
Apparemment mon commentaire du dessus a été tronqué, voici la suite :
Il y a une petite erreur dans la fonction : il manque la fonction LEN dans la dernière condition du CASE.
Ce qui donne donc :
CREATE FUNCTION Fn_CheckMail
(@_mail VARCHAR(320))
RETURNS BIT
WITH SCHEMABINDING
AS
BEGIN
RETURN CASE
WHEN CHARINDEX(‘ ‘, LTRIM(RTRIM(@_mail))) = 0 — Pas d’espaces
AND LEFT(LTRIM(@_mail), 1) ‘@’ — ‘@’ ne peut pas être le premier caractère de l’adresse
AND RIGHT(RTRIM(@_mail), 1) ‘.’ — ‘.’ ne peut pas être le dernier caractère de l’adresse
AND LEN(LTRIM(RTRIM(@_mail))) – LEN(REPLACE(LTRIM(RTRIM(@_mail)), ‘@’, »)) = 1 — Un seul ‘@’
AND CHARINDEX(‘.’, @_mail, CHARINDEX(‘@’, @_mail)) – CHARINDEX(‘@’, @_mail) > 1 — Il doit y avoir un ‘.’ après l’@
AND CHARINDEX(‘.’, REVERSE(LTRIM(RTRIM(@_mail)))) >= 3 — le nom de domaine doit se terminer avec au moins 2 caractères
AND CHARINDEX(‘.@’, @_mail) = 0 — pas de ‘.@’
AND CHARINDEX(‘..’, @_mail) = 0 — pas de ‘..’
AND LEN(LEFT(@_mail, CHARINDEX(‘@’, @_mail) – 1))