Non tentare di creare un'espressione regolare per convalidare le e-mail!
È notoriamente difficile da realizzare. Ecco una soluzione migliore:
Supponendo di avere Perl installato sul vostro host del database, installare il modulo E-mail :: Valido sullo stesso host utilizzando CPAN:
[email protected]$ cpan Email::Valid
quindi assicurarsi che si dispone di PL/Perl installato. La connessione al database in psql e aggiungere plperlu come lingua:
CREATE EXTENSION plperlu;
(Tenete a mente che questo è un linguaggio non attendibile, in modo darete il vostro accesso diretto ai file db, che potrebbe rappresentare un rischio per la sicurezza, se . qualcuno dovesse inserire codice dannoso nei vostri moduli Perl o nelle funzioni db Tuttavia, è necessario farlo per il passo successivo)
Aggiungere la seguente funzione al database:.
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;
Aggiungi un innescare il vincolo alla tua tabella sulla tua colonna (supponendo che tu la tabella è denominata "utenti" e la colonna è denominata "email"):
CREATE TRIGGER users_valid_email_trig
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE validate_email();
E il gioco è fatto!
Questa soluzione utilizza il modulo Email :: Valid Perl per gestire la convalida, che a sua volta si basa su un'espressione regolare per garantire la conformità RFC 822. Tuttavia, è un mostro di una regex, quindi non provare a inventare il tuo.
Se ti senti a disagio nell'abilitare plperlu invece di plperl semplice, potresti probabilmente trasferire le funzioni rilevanti nel tuo database.
E il tuo problema è? Non vedo alcun vincolo di controllo nel codice –
Per essere più specifico, ho pubblicato solo la funzione che non funziona. –
E che cosa "non funziona" esattamente? Hai un errore? Come appare il vincolo del controllo? –