与输入验证/检查约束作斗争

时间:2019-05-27 14:29:12

标签: sql tsql constraints

我正在尝试创建一个带有电子邮件地址列的表,并希望确保仅允许使用正确格式的地址(包含“ @”)。我知道如何在查询中使用LIKE运算符,但不知道如何在列上设置值约束。

2 个答案:

答案 0 :(得分:0)

您可以像这样为基本示例添加检查约束:

alter table t add contraint chk_email
    (check (email like '%@%') );

当然,那实际上只是一个下注。也许更像这样:

alter table t add contraint chk_email
    (check (email like '%_@[^.]%' and               -- one @ and something before and after
            email not like '%@%@%' and         -- not more than one @
            email not like '%[^-.a-zA-Z0-9_]%'  -- valid characters)
    );

这仍将允许无效的电子邮件,但至少距离更近。

答案 1 :(得分:0)

最好使用支持正则表达式或已经内置isValidEmail方法的编程语言来完成。

使用正则表达式或简单的like模式验证电子邮件地址非常困难,即使不是几乎不可能。

您可以在I Knew How To Validate An Email Address Until I Read The RFC上了解更多相关信息-并引用我认为最能说明问题的部分:

  

这些都是有效的电子邮件地址!

     
      
  • Abc @ def @ example.com
  •   
  • Fred \ Bloggs@example.com
  •   
  • Joe。\ Blow@example.com
  •   
  • “ Abc @ def” @ example.com
  •   
  • “ Fred Bloggs” @ example.com
  •   
  • customer/department=shipping@example.com
  •   
  • $A12345@example.com
  •   
  • !def!xyz%abc@example.com
  •   
  • _somename@example.com
  •   

尝试获得在T-SQL语句中验证如此广泛的可能性所需的所有逻辑,就像尝试用双手在背后绑住盲目地攀登珠穆朗玛峰一样。

您可以使用简单的like模式(例如Pinal Dave在How to Validate Email Address in SQL Server?中建议的模式)进行简单的验证,以返回很多假阳性或假阴性:'%_@__%.__%' ,但这实际上只是用创可贴堵塞大坝的天真尝试。

话虽如此,您也许可以使用CLR Scalar-Valued Function中的代码,使用this SO post来验证电子邮件地址。

我个人没有CLR函数的经验,因此尝试为您编写代码示例对我来说可能是不负责任的(特别是因为在发布此答案之前我没有真正的测试环境来检查它) ,但我希望到目前为止所写的内容能对您有所帮助,并且借助此答案中的链接和一些网络搜索,您将能够解决问题。