Борьба с проверкой ввода / проверкой ограничений - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь создать таблицу со столбцом адреса электронной почты и хочу убедиться, что разрешены только адреса в правильном формате (содержит "@").Я знаю, как использовать оператор LIKE в запросах, но не знаю, как наложить ограничение на значение для столбца.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Это было бы лучше сделать на языке программирования, который поддерживает регулярные выражения или уже имеет встроенный метод isValidEmail.

Проверка адреса электронной почты с использованием регулярного выражения или простого шаблона like чертовски трудно понять, если не почти невозможно.

Подробнее об этом можно прочитать на Я знал, как проверять адрес электронной почты, пока не прочитал RFC - И процитировать ту часть, которая, по моему мнению, лучше всего иллюстрирует проблему:

Это все действительные адреса электронной почты!

  • Abc @ def @ example.com
  • Fred \ Bloggs@example.com
  • Джо. \ Blow@example.com
  • "Abc @ DEF" @ example.com
  • "Фред Блоггс" @ example.com
  • customer/department=shipping@example.com
  • $A12345@example.com
  • !def!xyz%abc@example.com
  • _somename@example.com

Попытка получить всю логику, необходимую для проверки такого широкого диапазона возможностей в инструкции T-SQL, - это все равно, что пытаться подняться на Эверест с завязанными глазами, с руками, связанными за спиной.

У вас может быть простая проверка, которая может вернуть много ложных срабатываний или ложных отрицаний, используя простой шаблон like, подобный предложенному в Как проверить адрес электронной почты в SQL Server? с помощью Пиналь Дэйв: '%_@__%.__%', но это на самом деле просто наивная попытка забить плотину лейкопластырем.

Сказав все это, вы, возможно, сможете использовать Скалярную функцию CLR для проверки ваших адресов электронной почты, используя код, подобный коду этого сообщения SO .

Лично у меня нет опыта работы с функциями CLR, поэтому я, вероятно, безответственно попытался бы написать вам пример кода (особенно, поскольку у меня нет тестовой среды, чтобы проверить его перед тем, как опубликовать этот ответ) , но я надеюсь, что то, что я написал до сих пор, было достаточно полезным, и с помощью ссылок в этом ответе и некоторых поисковых запросов в Интернете вы сможете решить эту проблему.

0 голосов
/ 27 мая 2019

Вы можете добавить проверочное ограничение следующим образом. Для вашего базового примера:

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

Это по-прежнему допускает недействительные электронные письма, но, по крайней мере, ближе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...