Не пытайтесь создать регулярное выражение для проверки электронной почты!
Общеизвестно, что это трудно сделать.Вот лучшее решение:
Предполагая, что на вашем хосте базы данных установлен Perl, установите модуль Email :: Valid на том же хосте с использованием CPAN:
you@localhost$ cpan Email::Valid
Затем убедитесь, что выустановить PL / PerlПодключитесь к вашей базе данных в psql и добавьте plperlu в качестве языка:
CREATE EXTENSION plperlu;
(Имейте в виду, что это ненадежный язык, поэтому вы будете предоставлять прямой доступ к файлу вашей БД, что может создать безопасностьриск того, что кто-то вставит вредоносный код в ваши модули Perl или в функции db. Однако вам нужно сделать это для следующего шага.)
Добавьте следующую функцию в вашу базу данных:
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;
Добавьте ограничение триггера к вашей таблице в вашем столбце (при условии, что ваша таблица называется «users», а ваш столбец - «email»):
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, вы, вероятно, могли бы перенести соответствующие функции в вашу базу данных..