不要试图创建用于验证电子邮件的正则表达式!
这是非常困难的。以下是更好的解决方案:
假设您的数据库主机已安装Perl,请使用CPAN在同一主机上安装Email::Valid模块:
you@localhost$ 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;
在您的表上为您的列添加触发约束(假设您的表名为“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,您可能可以将相关函数移植到您的数据库中。