2010-02-09 41 views
5

Sử dụng Microsoft SQL Server 2005 trở lên, tôi sử dụng mã nào để xác thực rằng địa chỉ email là chính xác?
Có loại dữ liệu email nào không?
Có ràng buộc kiểm tra email không?
Có quy tắc email không?
Có trình kích hoạt email không?
Có quy trình lưu trữ xác thực email không?Xác thực email Microsoft SQL Server

Trả lời

6

Tôi thường không khuyên dùng Quy trình lưu trữ CLR, nhưng đây là cách sử dụng tốt nhất. Khả năng xử lý chuỗi của SQL không lớn, trong khi sử dụng .NET Regex trong một thủ tục lưu trữ CLR rất đơn giản và bạn có thể sử dụng một trong nhiều mẫu Regex hiện có để đáp ứng nhu cầu của bạn (chẳng hạn như một trong số these). Xem Regular Expressions Make Pattern Matching And Data Extraction Easier

Không đó (một số của DBA là rất nghiêm ngặt về kích hoạt tính năng CLR), có lẽ điều này có thể quan tâm:

Working with email addresses in SQL Server

Cập nhật: để đáp lại câu hỏi trong ý kiến: Một CLR stored procedure là một đối tượng cơ sở dữ liệu bên trong một thể hiện của SQL Server được lập trình trong một hội đồng được tạo trong Microsoft .NET Framework thời gian chạy ngôn ngữ chung (CLR), chẳng hạn như Visual Basic hoặc C#.

Tạo một thủ tục lưu trữ CLR trong SQL máy chủ bao gồm các bước sau:

  • Xác định thủ tục lưu trữ như một phương pháp tĩnh của một lớp trong một ngôn ngữ được hỗ trợ bởi .NET Framework. Để biết thêm thông tin về cách lập trình CLR được lưu trữ, hãy xem CLR được lưu trữ Quy trình. Sau đó, biên dịch lớp thành xây dựng một assembly trong .NET Framework bằng cách sử dụng trình biên dịch ngôn ngữ thích hợp.

  • Đăng ký lắp ráp trong SQL Server bằng cách sử dụng câu lệnh CREATE ASSEMBLY . Để biết thêm thông tin về cách làm việc với các hội đồng trong SQL Máy chủ, hãy xem Hội đồng.

  • Tạo quy trình được lưu trữ tham chiếu đến hội đồng đã đăng ký theo số sử dụng câu lệnh CREATE PROCEDURE. Ref.

Xem Writing CLR Stored Procedures in C# - Introduction to C# (Part 1)

+0

Thủ tục lưu trữ CLR là gì? Đó có phải là giống như một thủ tục lưu trữ? CLR từ viết tắt khiến tôi bối rối. –

+1

CLR là ngôn ngữ chung Runtime - một thủ tục lưu trữ CLR (hoặc chức năng, vv) cho phép bạn viết một thủ tục trong C# nhưng gọi nó trực tiếp từ T-SQL. – onupdatecascade

1

Bạn có thể viết SP quản lý sử dụng lớp Regex. xác thực email theo RFC là điều phức tạp. Chúng tôi chỉ cần truy vấn AD cho sự tồn tại của người dùng.

+0

nếu đây là những người dùng bên ngoài không có trong AD? –

+0

Tôi đồng ý. Câu hỏi ban đầu là làm thế nào để xác nhận một địa chỉ email, không xác nhận rằng người dùng đang ở trong Active Directory. –

+0

@Mitch có chắc chắn rằng nó hoạt động ony trong trường hợp _special_ của chúng tôi –

1

Không có cơ chế tích hợp trong SQL Server để xác thực địa chỉ email.

Có nhiều cụm từ thông dụng xung quanh việc xác thực địa chỉ email (một số dài hơn nhiều so với các địa chỉ khác), ví dụ: here, xem cụ thể "Chuẩn mực chính thức: RFC 2822" reg cũ.

Bây giờ, SQL Server không có hỗ trợ để chạy biểu thức chính quy, vì vậy nếu bạn thực sự muốn thực hiện trong SQL, bạn cần sử dụng chức năng CLR - tức là viết một hàm .NET thực hiện xác thực , sau đó có thể được gọi từ SQL.

Tuy nhiên, tôi sẽ xác thực địa chỉ email trước đó, trước khi đến cơ sở dữ liệu.

+0

Tôi muốn đặt xác thực càng gần với cấp cơ sở dữ liệu càng tốt. Quy tắc không được thực thi ở cấp cơ sở dữ liệu chỉ là một gợi ý. –

+0

Tôi nghe những gì bạn đang nói, và tôi không nói rằng tôi không đồng ý hoàn toàn ... nhưng, ít nhất cũng nên * được thực hiện sớm hơn (tức là sớm hơn bạn có thể xác nhận đầu vào và thu thập dữ liệu xấu, càng sớm càng tốt người dùng có thể được thông báo == trải nghiệm người dùng tốt hơn). Đây là một ví dụ điển hình về nơi bạn có thể sử dụng SQL CLR (Common Language Runtime) để đạt được điều này ở cấp cơ sở dữ liệu (mã .NET đang chạy trong SQL Server) – AdaTheDev

1

Nếu OLE tự động được kích hoạt, bạn có thể dễ dàng tạo ra một UDF để xử lý regexes, và sau đó chỉ cần gọi đó là:

CASE WHEN dbo.RegExFind 
    (
    '[email protected]', 
    '^[a-z0-9][a-z0-9._-]*@[a-z0-9][a-z0-9.-]*[a-z0-9]\.[a-z][a-z]+$', 
    1 -- Case-insensitive or not 
    ) = 1 THEN 'OK' ELSE 'Not OK' END 

tôi không nhớ nơi tôi đã nhận mã cho RegExFind() UDF của tôi, nhưng nó có vẻ như mã đã xuất hiện trên StackOverflow, here.

Các vấn đề liên quan