Erzwingen Sie die Datenintegrität in einer E-Mail-Spalte in einer Datenbank

7

Ich möchte eine E-Mail-Spalte wie folgt einschränken: [email protected] Offensichtlich ist "x" unterschiedlich lang und x ist ein Teil der Zeichenfolgendaten, und .yyy ist ein Domänentyp von .com, .gov usw.

UpwardD
quelle
Welche Art von Einschränkung möchten Sie platzieren?
Ypercubeᵀᴹ
Eine Einschränkung, die verhindert, dass fehlerhafte oder unvollständige E-Mail-Adressen in einer Datenbank
landen
2
Es gibt keine einfache Möglichkeit, eine E-Mail-Adresse zu überprüfen (überprüfen Sie eine verwandte Frage unter SO: stackoverflow.com/questions/201323/… ), geschweige denn in SQL.
Ypercubeᵀᴹ
Sie können auch After Trigger verwenden, um Daten aus der eingefügten Tabelle zu überprüfen und festzustellen, ob der Name im gültigen Format vorliegt. Wenn Sie eine Masseneinfügung durchführen, sollte Ihr Trigger auch dieses Szenario behandeln.
TheGameiswar

Antworten:

6

Dies ist eine viel zu große Aufgabe, wenn Sie sie richtig ausführen möchten. Wenn Sie SQL CLR verwenden können, gehen wir in unserem Unternehmen folgendermaßen vor:

using System;
using System.Net.Mail;
using Microsoft.SqlServer.Server;

namespace Functions
{
    public static class Utilities
    {
        [SqlFunction]
        public static bool IsValidEmail(string email)
        {
            if (string.IsNullOrEmpy(email))
                return false;

            bool isValid = false;
            try
            {
                // use the validation provided by the System.Net.Mail.MailAddress class            
                var mailAddress = new MailAdress(email); 
                isValid = true;
            }
            catch(FormatException)
            {
                isValid = false;
            }
            return isValid;
        }
    }
}

Angenommen, Sie stellen es so bereit, wie dbo.fn_IsValidEmailSie es in Ihrer Prüfbedingung verwenden können, wie Sie es bei jeder anderen Skalarfunktion tun würden:

create table dbo.tbl
(
    id int identity not null,
    email nvarchar(256) not null,
    constraint ck_tbl_isValidEmail check (dbo.fn_IsValidEmail (email))
);

Wenn Ihre Spalte dies zulässt, müssen NULLSie stattdessen den ersten Teil der Funktion wie folgt ändern:

if (email == null)
    return true;
if (email == string.Empty)
    return false;

Dokumentation:

System.Net.Mail.MailAddress

Microsoft.SqlServer.Server.SqlFunctionAttribute

CLR-Funktionen

Weltweiter DBA
quelle
0

Ich benutze folgendes:

select * from api.ParseEmail('[email protected]');

Die TVF gibt drei Werte: UserName (string), DomainName (string), undIsValid (bit)

Dies stellt sicher, dass die übergebene Zeichenfolge eine gültige "Form" hat, da das Validieren einer E-Mail, wie andere bereits betont haben, eine schwierige Angelegenheit ist (hauptsächlich, weil sich die als gültig geltenden Änderungen je nach Kontext, Verwendung, Meinung ... ändern). Sie können dann alles, was Sie wollen, "darüber" kleben, indem Sie es in eine andere Funktion einwickeln.

Möglicherweise benötigen Sie, dass DomainName länger als X ist:

select a.UserName
     , a.DomainName
     , case
           when a.IsValid and Len(a.DomainName) > 2 then 1
           else 0
       end as IsValid
from api.ParseEmail as a;

Code:

create function api.ParseEmail (   
    @x nvarchar(256) = null
)
returns table
with schemabinding
as   
return (
    select UserName.s as UserName
         , DomainName.s as DomainName
         , case
               when ([IndexOf@].n != 0 and UserName.s is not null and DomainName.s is not null) then 1
               else 0
           end as IsValid
    from (values(PatIndex('%@%', @x))) as [IndexOf@] (n)
    cross apply (values(NullIf(Substring(@x, 0, [IndexOf@].n), ''))) as UserName (s)
    cross apply (values(NullIf(Substring(@x, [IndexOf@].n + 1, Len(@x) - [IndexOf@].n), ''))) as DomainName (s)
);
Kittoes0124
quelle