Oi! Seja bem-vindo!

Hoje em dia, nosso e-mail uma informação tão importante e relevante quanto documentos ou nosso endereço físico. Por isso hoje vamos aprender como validar o formato de e-mails no SQL Server.

Isso impedirá que dados mal formatados ou até mesmo maliciosos sejam incluídos em suas tabelas, o que é ótimo não só como medida de segurança, mas também no sentido de evitar erros de digitação.

Como VALIDAR o FORMATO de E-MAILS no SQL Server

Há duas abordagens para validar um e-mail, via programação armazenada (ex: funções ou procedures) e via constraints (ou restrições de integridade) aplicadas diretamente a tabela do SQL. Nesse artigo optei pela restrição via constraints, pois essa é uma forma de efetivamente proteger o seu banco de dados maliciosos ou mal formatados devido a erro de digitação.

O segredo da validação está no uso de check constraints, poderíamos fazer a validação inteira usando apenas uma, porém eu prefiro desmembrar em mais de uma para ficar mais fácil de ver qual regra foi barrada quando o usuário tenta inserir um e-mail inválido.

No script inclui as regras e também comentários para você ver exatamente como cada regra valida parte do formato do e-mail. Também inclui testes no final do script, fique a vontade para criar seus próprios testes, é um ótimo exercício!


------------------------------------------------------------------
-- Como validar o formato de e-mails no SQL
------------------------------------------------------------------
--------------------------------------------------
-- Requisitos para nosso teste
--------------------------------------------------
-- Banco de testes
use master
if db_id('curso') is not null 
	drop database curso
go
create database curso
go
use curso
go

--------------------------------------------------
-- Validando e-mails via check
--------------------------------------------------
-- Tabela de testes
if object_id('amigos') is not null drop table amigos
create table amigos (
	nr int, 
	nome varchar(100),
	email varchar(200),
	constraint ck_amigos_email01 check (email like '[a-z,0-9,_,-]%@[a-z,0-9,_,-]%.[a-z]%'), -- exige formato: [letras-numeros-underline-traço] + [qualquer coisa] + [@] + [letras-numeros-underline-traço] + [qualquer coisa] + [.] + [letras] + qualquer coisa
	constraint ck_amigos_email02 check (email not like '%[^a-z0-9@._-]%'), -- impede caracteres que não sejam: a-z 0-9 @ . _ -
	constraint ck_amigos_email03 check (email not like '%@%@%'), -- impede dois arrobas
	constraint ck_amigos_email04 check (email not like '%.@%'), -- impede .@
	constraint ck_amigos_email05 check (email not like '%..%'), -- impede ..
	constraint ck_amigos_email06 check (email not like '%.') -- impede terminar com .
)


-- ERRO: Formatos inválidos
insert into amigos values (1, 'josue', '@teste.com') -- começando com @
insert into amigos values (1, 'josue', 'josue@teste') -- sem sufixo de domínio
insert into amigos values (1, 'josue', 'jo ue@teste') -- espaço
insert into amigos values (1, 'josue', 'jo"ue@teste') -- aspas
insert into amigos values (1, 'josue', 'jo$ue@teste') -- caracteres especiais
insert into amigos values (1, 'josue', 'josue^[email protected]') -- caracteres especiais
insert into amigos values (1, 'josue', 'josue][email protected]') -- caracteres especiais
insert into amigos values (1, 'josue', 'josue%[email protected]') -- caracteres especiais
insert into amigos values (1, 'josue', '[email protected]') -- @. juntos
insert into amigos values (1, 'josue', 'josue@@teste.com') -- 2 arrobas juntos
insert into amigos values (1, 'josue', 'josue@[email protected]') -- 2 arrobas separados
insert into amigos values (1, 'josue', '[email protected]') -- .@ juntos
insert into amigos values (1, 'josue', '[email protected]') -- .. juntos
insert into amigos values (1, 'josue', '[email protected].') -- . no final


-- OK: Formatos válidos
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')
insert into amigos values (1, 'josue', '[email protected]')


-- Excluindo dados de teste
use master
drop database curso

CONCLUSÃO

Como podes ver, sou um entusiasta da prevenção de problemas… kkkk se é que isso define alguma coisa… Enfim, eu gosto de que meus bancos de dados sejam “o mais blindados possível” contra mal uso ou problemas de segurança, e acho que esse tipo de abordagem ajuda significativamente.

Por essas razões, encorajo você a aplicar esse tipo de constraint não só para e-mail, mas também para outros tipos de campo texto que possam ser enquadrados em alguma regra geral.

Abraço do seu amigo Josué

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *