Métodos para validar email no SQL Server 2019!
Deixo um plus para validar email em base de dados (Oracle, SQL Server, Postgres, MySQL...) na criação da tabela.
A programação tem evoluído numa velocidade incrível, entretanto os padrões ANSI do SQL têm sido mais conservadores, veja só, existem linguagens de programação que já fazem essa validação na tipagem de dados, contudo quando falamos de padrão ANSI para SQL, e ai “o buraco é mais embaixo”.
Então, encontrei duas formas simples de fazer isso, cada uma tem sua característica específica. Veja:
1ª Forma: Função
Isso mesmo, por questões de validação de parâmetros que eram passados na chamada de uma stored procedure, precisei validar um parâmetro e-mail.
Por quê? Uma questão pontual!
/*
Funcionalidade: Validar o formato de e-mails no SQL Criado em: 01/05/2010 Criado por: Anderson Abreu Descrição: Validar parâmetro email como variável ou Validando campos de email cadastrados em uma tabela Regras: */ use master GO if db_id('tst_function_email') is not null drop database tst_function_email go create database tst_function_email go use tst_function_email go create or alter function dbo.fg_verifica_email ( @email varchar(150) ) returns varchar(20) as begin declare @valid varchar(20) if @email is not null begin set @email = lower(@email) set @valid = 'Não é válido' if @email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z]%' and @email not like '%@%@%' and charindex('.@',@email) = 0 and charindex('..',@email) = 0 and charindex(',',@email) = 0 and charindex('''',@email) = 0 and charindex('^',@email) = 0 and charindex(']',@email) = 0 and charindex('%',@email) = 0 and right(@email,1) not like '.' begin set @valid='Válido' end end return @valid end go -- Vamos Testar -- FORMATOS NÃO PERMITIDOS -- começando com @ select dbo.fg_verifica_email('@dominio.com') -- sem sufixo de domínio select dbo.fg_verifica_email('anderson@dominio') -- espaço select dbo.fg_verifica_email('po ker@dominio') -- aspas select dbo.fg_verifica_email('po"ker@dominio') -- caracteres especiais select dbo.fg_verifica_email('po$ker@dominio') select dbo.fg_verifica_email('anderson^pokemon@dominio.com') select dbo.fg_verifica_email('anderson]pokemon@dominio.com') select dbo.fg_verifica_email('anderson%pokemon@dominio.com') -- @. juntos select dbo.fg_verifica_email('anderson@.dominio.com') -- 2 arrobas juntos select dbo.fg_verifica_email('anderson@@dominio.com') -- 2 arrobas separados select dbo.fg_verifica_email('anderson@dominio@dominio.com') -- .@ juntos select dbo.fg_verifica_email('anderson.@dominio.com') -- .. juntos select dbo.fg_verifica_email('anderson@dominio..com') -- . no final select dbo.fg_verifica_email('anderson@dominio.ad.') -- FORMATOS PERMITIDOS select dbo.fg_verifica_email('anderson@dominio.com.br') select dbo.fg_verifica_email('anderson@dominio.com') select dbo.fg_verifica_email('anderson.abreu@dominio.com') select dbo.fg_verifica_email('anderson_abreu@dominio.com') select dbo.fg_verifica_email('anderson-abreu@dominio.com') select dbo.fg_verifica_email('anderson@sistemaexpresso.net.br') select dbo.fg_verifica_email('anderson193@dominio.com') select dbo.fg_verifica_email('2020@2020.net.br') -- Excluindo dados de teste use master go drop database tst_ function_email go |
---|
2ª Forma: Constraints na tabela
São criadas constraints na tabela, com validação REGEX. Contudo, nesse cenário, o dado é validado no momento que é persistido na tabela. Veja um código bem bacana:
/* Funcionalidade: Validar o formato de e-mails no SQL Criado em: 01/05/2010 Criado por: Anderson Abreu Descrição: Validar persistência de dados de email em tabela com check constraints Regras: ck_rule_email_01 exige formato: [letras-numeros-underline-traço] + [qualquer coisa] + [@] + [letras-numeros-underline-traço] + [qualquer coisa] + [.] + [letras] + qualquer coisa ck_rule_email_02 impede caracteres que não sejam: a-z 0-9 @ . _ - ck_rule_email_03 impede dois arrobas ck_rule_email_04 impede .@ ck_rule_email_05 impede .. ck_rule_email_06 impede terminar com . */ use master GO if db_id('tst_constraint_email') is not null drop database tst_constraint_email go create database tst_constraint_email go use tst_constraint_email go if object_id('tb_pessoa') is not null drop table tb_pessoa create table tb_pessoa ( pk_pessoa int identity primary key, no_pessoa varchar(150), cd_email varchar(150), constraint ck_rule_email_01 check (cd_email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z]%'), constraint ck_rule_email_02 check (cd_email not like '%[^a-z0-9@._-]%'), constraint ck_rule_email_03 check (cd_email not like '%@%@%'), constraint ck_rule_email_04 check (cd_email not like '%.@%'), constraint ck_rule_email_05 check (cd_email not like '%..%'), constraint ck_rule_email_06 check (cd_email not like '%.') ) -- Vamos Testar -- FORMATOS NÃO PERMITIDOS -- começando com @ insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', '@dominio.com') -- sem sufixo de domínio insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio') -- espaço insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'po ker@dominio') -- aspas insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'po"ker@dominio') -- caracteres especiais insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'po$ker@dominio') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson^pokemon@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson]pokemon@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson%pokemon@dominio.com') -- @. juntos insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@.dominio.com') -- 2 arrobas juntos insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@@dominio.com') -- 2 arrobas separados insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio@dominio.com') -- .@ juntos insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson.@dominio.com') -- .. juntos insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio..com') -- . no final insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio.ad.') -- FORMATOS PERMITIDOS insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio.com.br') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson.abreu@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson_abreu@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson-abreu@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson@sistemaexpresso.net.br') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', 'anderson193@dominio.com') insert into tb_pessoa (no_pessoa, cd_email) values ('Anderson Abreu', '2020@2020.net.br') -- Excluindo dados de teste use master go drop database tst_constraint_email go |
---|