2010-02-09 20 views
5

Microsoft SQL Server 2005 ve yukarısını kullanarak, bir e-posta adresinin doğru olduğunu doğrulamak için hangi kodu kullanırım?
E-posta veri türü var mı?
E-posta kontrol kısıtlaması var mı?
E-posta kuralı var mı?
E-posta tetikleyicisi var mı?
E-posta doğrulama saklı yordamı var mı?Microsoft SQL Server e-posta doğrulaması

cevap

6

Genellikle CLR Stored Procedure kullanmıyorum, ancak bu iyi bir kullanımdır. CLR Depolanmış Prosedüründe .NET Regex'in kullanılması basittir ve ihtiyaçlarınızı karşılamak için mevcut birçok Regex modelinden birini kullanabilirsiniz (örneğin, these). Regular Expressions Make Pattern Matching And Data Extraction Easier

(bazı DBA en CLR özelliği etkinleştirdikten konuda çok sıkı) Bu gerçekleşmediği takdirde bakınız, belki de bu ilgi olabilir:

Working with email addresses in SQL Server

Güncelleme: yanıtta yorumlarda sorgulamaya A CLR stored procedure Visual Basic veya C# gibi Microsoft .NET Framework ortak dil çalışma zamanı (CLR) içinde oluşturulan bir derlemede programlanmış bir SQL Server örneğinin içinde bir veritabanı nesnesidir. SQL Server bir CLR saklı yordam oluşturma

aşağıdaki adımları içerir:

  • .NET Framework tarafından desteklenen bir dilde bir sınıfın statik yöntem olarak saklı yordam tanımlayın. için CLR saklı yordamları programlamayla ilgili daha fazla bilgi için bkz. CLR Kayıtlı Prosedürler. Daha sonra, sınıf derleme uygun Dil derleyici uygun bir Framework derleme oluşturmak derleyin.

  • Derleme SQL Server'da CREATE ASSEMBLY bildirimini kullanarak kaydedin. hakkında daha fazla bilgi için SQL Sunucusu'nda derlemeler ile çalışma hakkında bilgi için, bkz.

  • CREATE PROCEDURE deyimini kullanarak kayıtlı derlemeyi 'a başvuran saklı yordamını oluşturun. Ref.

Sen Regex sınıfını kullanarak yönetilen SP yazabilir Writing CLR Stored Procedures in C# - Introduction to C# (Part 1)

+0

CLR Stored Procedure nedir? Bu saklı bir prosedür ile aynı mı? Kısaltma CLR beni şaşırttı. –

+1

CLR, Ortak Dil Çalışma Zamanı - CLR Saklı Yordam (veya işlevi vb.) C# içinde bir yordam yazmanıza izin verir, ancak doğrudan T-SQL'den çağırır. – onupdatecascade

1

bakınız. RFC'ye göre e-posta doğrulama karmaşık bir şeydir. Sadece AD'yi kullanıcı varlığı için sorgularız.

+0

Bu harici kullanıcılar AD değillerse ne olur? –

+0

Katılıyorum. Asıl soru, bir e-posta adresini doğrulamak, bir kullanıcının Active Directory'de olduğunu doğrulamak değildi. –

+0

@Mitch evet, _special_ case –

1

SQL Server'da e-posta adreslerini doğrulamak için yerleşik bir mekanizma yoktur. E-posta adresini doğrulayan çok sayıda normal ifade vardır (bazıları diğerlerinden çok daha uzun) örn. here, özellikle bakınız "Resmi Standart: RFC 2822" reg.

SQL Server, normal ifadeleri çalıştırmak için yerleşik bir destek sağlamamıştır, bu nedenle SQL'de gerçekten yapmak istiyorsanız, CLR işlevselliğini kullanmanız gerekir - örneğin, doğrulama işlemini gerçekleştiren bir .NET işlevi yazın. Daha sonra SQL'den çağrılabilir. Bununla birlikte, veritabanına gelmeden önce e-posta adresini daha önce doğrulayacağım.

+0

'da çalışır durumda olduğundan emin olun. Doğrulamayı veritabanının mümkün olduğunca yakınına koymak istiyorum. Veritabanı düzeyinde zorlanmamış bir kural sadece bir öneridir. –

+0

Söylediklerinizi duyuyorum ve tamamen katılmıyorum demiyorum ... ama, en azından * daha önce yapılmalı (yani, girişi doğrulayabilmeniz ve kötü verileri yakalayabilmeniz ne kadar erken olursa, kullanıcı bilgilendirilebilir == daha iyi kullanıcı deneyimi). Bu, veritabanı düzeyinde (SQL Server içinde çalışan .NET kodu) bunu başarmak için SQL CLR (Ortak Dil Çalışma Zamanı) kullanabileceğiniz klasik bir örnektir. – AdaTheDev

1

OLE otomasyon etkinse, kolayca Regexes işlemek için bir UDF oluşturmak ve sonra sadece o arayabilirsiniz: Benim RegExFind() UDF için kod nereden

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 

Hatırlamıyorum, ama Kod, StackOverflow, here'da zaten var gibi görünüyor.