Thực thi toàn vẹn dữ liệu trên cột Email trong cơ sở dữ liệu


7

Tôi muốn đặt một ràng buộc trên một cột email như vậy: xxxx@xxxx.yyy Rõ ràng "x" có độ dài khác nhau và x là một phần của dữ liệu chuỗi và .yyy là một loại tên miền của .com, .gov, v.v.


Những loại ràng buộc nào bạn muốn đặt?
ypercubeᵀᴹ 7/12/2015

Một ràng buộc ngăn chặn các địa chỉ email xấu hoặc không đầy đủ hạ cánh vào cơ sở dữ liệu
UpwardD

2
Không có cách nào dễ dàng để xác thực một địa chỉ email (kiểm tra một câu hỏi liên quan tại SO: stackoverflow.com/questions/201323/ mẹo ), hãy để một mình làm điều này trong SQL.
ypercubeᵀᴹ 7/12/2015

bạn cũng có thể sử dụng sau khi kích hoạt kiểm tra dữ liệu từ bảng đã chèn và xem tên có ở định dạng hợp lệ hay không. Một điều cần lưu ý là nếu bạn đang thực hiện chèn số lượng lớn, trình kích hoạt của bạn cũng sẽ xử lý tình huống đó.
TheGameiswar 7/12/2015

Câu trả lời:


6

Đây là một nhiệm vụ quá lớn nếu bạn muốn thực hiện đúng cách. Nếu bạn có thể sử dụng SQL CLR mặc dù đây là cách chúng tôi làm điều đó tại công ty của chúng tôi:

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;
        }
    }
}

Và sau đó giả sử bạn triển khai nó vì dbo.fn_IsValidEmailbạn có thể sử dụng nó trong ràng buộc kiểm tra của mình giống như bất kỳ hàm vô hướng nào khác như vậy:

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

Nếu cột của bạn cho phép NULLthì bạn sẽ cần thay đổi phần đầu tiên của hàm này thành:

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

Tài liệu:

System.Net.Mail.MailAddress

Microsoft.SqlServer.Server.SqlFunctionAttribution

Chức năng CLR


0

Tôi sử dụng như sau:

select * from api.ParseEmail('mail@domain.com');

Các TVF trả về ba giá trị: UserName (string), DomainName (string), vàIsValid (bit)

Điều này đảm bảo rằng chuỗi được truyền có "hình dạng" hợp lệ bởi vì, như những người khác đã chỉ ra, xác thực email là một công việc khó khăn (chủ yếu là vì những gì được coi là thay đổi hợp lệ tùy thuộc vào ngữ cảnh, cách sử dụng, quan điểm ...). Sau đó, bạn có thể dán bất cứ thứ gì bạn muốn "lên trên" bằng cách gói nó vào một chức năng khác.

Có thể bạn yêu cầu DomainName dài hơn X:

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;

Mã số:

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)
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.