Не пытайтесь создать регулярное выражение для проверки электронной почты!
Это, как известно, трудно выполнить. Вот лучшее решение:
Если предположить, что у вас есть Perl, установленных на вашем сервере базы данных, установить E-mail :: Действительный модуль на одном хосте с помощью CPAN:
[email protected]$ cpan Email::Valid
Затем убедитесь, что у вас есть PL/Perl установлен. Подключение к базе данных в PSQL и добавить plperlu как язык:
CREATE EXTENSION plperlu;
(Имейте в виду, что это ненадежный язык, так что вы будете давая вашей БД прямого доступа к файлам, которые могут представлять угрозу безопасности, если . кто-то вставить вредоносный код в свои модули Perl или в функции дб Однако, вы должны сделать это для следующего шага)
Добавьте следующую функцию в базе данных:.
CREATE FUNCTION validate_email() RETURNS trigger AS $$
use Email::Valid;
return if Email::Valid->address($_TD->{new}{email});
elog(ERROR, "invalid email address $_TD->{new}{email} inserted into $_TD->{table_name}(email)");
return "SKIP";
$$ LANGUAGE plperlu;
Добавить триггер-ограничение для вашей таблицы в столбце (при условии, что вы r стол называется «пользователями», а ваша колонка называется «электронная почта»):
CREATE TRIGGER users_valid_email_trig
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE validate_email();
И все готово!
Это решение использует модуль Email: Valid Perl для обработки валидации, который, в свою очередь, полагается на регулярное выражение для обеспечения соответствия RFC 822. Тем не менее, это монстр регулярных выражений, поэтому не пытайтесь придумать свои собственные.
Если вы чувствуете дискомфорт при включении plperlu вместо обычного plperl, возможно, вы можете перенести соответствующие функции в свою базу данных.
И ваша проблема? Я не вижу ограничений в вашем коде –
Чтобы быть более конкретным, я опубликовал только функцию, которая не работает. –
А что именно «не работает»? Вы получили сообщение об ошибке? Как выглядит ограничение проверки? –