Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Validações no banco ou na aplicação?

Galera,

Estou desenvolvendo uma aplicação web em Java e costumo utilizar o sql diretamente no java através do JDBC.

Dessa vez quis mudar um pouco, em vez de executar selects, inserts, updates dentro do java eu desenvolvi toda regra de negócio e validações dentro do banco através de procedures e na aplicação eu apenas consumo essas procedures.

CREATE PROCEDURE autenticarUsuario    @usuario    NVARCHAR(32),        --    [0] USUÁRIO NÃO AUTENTICADO
                                      @senha      NVARCHAR(32),        --    [1] USUÁRIO AUTENTICADO
                                      @retorno    INT OUTPUT
AS
    IF (SELECT COUNT(*) FROM loginUsuario WHERE usuario=@usuario AND senha=@senha) >= 1
        SET @retorno = 1;
    ELSE
        SET @retorno = 0;
GO
public static Usuario autenticarUsuario(String usuario, String senha) throws SQLException {
        Connection con = ConnectionFactory.getConnection();
        CallableStatement cs = con.prepareCall("EXEC autenticarUsuario ?,?,?");
        cs.setString(1,usuario);
        cs.setString(2,senha);
        cs.registerOutParameter(3,Types.NUMERIC);
        cs.execute();        
        int codRetorno = cs.getInt(3);

        if(codRetorno==0)
            throw new AutenticacaoNaoAutorizada("Falha na autenticação");

        ConnectionFactory.closeConnection(con,cs);
        Login login = LoginDAO.getLogin(usuario,senha);
        return UsuarioDAO.getUsuario(login.getId());
    }

Isso fez surgir diversas dúvidas:

1) É uma boa abordagem manter toda regra de negocio e validações dentro do banco? No ambiente empresarial se usa dessa forma?

2) É normal minhas procedures retornarem códigos do tipo inteiro para informar possíveis erros ou sucesso na execução?

Exemplo: 1=sucesso, 2=cpf invalido, 3=usuario já existe, etc...

Obrigado!!

2 respostas
solução!

Olá Felipe, tudo bem?

Sou DBA faz 13 anos e já trabalhei para empresas que tiveram abordagens diferentes a esta questão que você está levantando aqui.

Acho que a resposta para sua primeira pergunta seria: "depente". Em algumas empresas que trabalhei, o core do negócio estava baseado ao redor do banco de dados proprietário que a mesma possuía. O valor era alto pelas licenças porém a confiabilidade e parceria com a fornecedora do banco de dados eram mais importantes que a linguagem de programação utilizada. Sendo assim, era possível trocar a linguagem de programação sem a necessidade de se preocupar com a reescrita das regras de negócio.

Já trabalhei para empresas que dividiam as responsabilidades. A regra de negócios fica na programação, porém a automação de algumas tarefas referentes ao negócio ficavam para o banco de dados resolver. Tabelas de log, triggers com funcionalidades específicas e etc.

E já trabalhei para uma empresa que as regras do negócio ficavam no "meio do caminho". Havia uma camada de arquivos XML, arquivos SQL e arquivos JSON, todos eles não específicos para nenhum(a) software e/ou linguagem de programação, porém, facilmente lidos e interpretados por qualquer linguagem e qualquer SGBD. Ou seja, essa empresa possibilitava facilmente a troca de linguagem ou a troca de banco de dados sem afetar em nada o core do negócio.

Então, na minha opinião, a questão aqui seria: qual opção lhe beneficia mais? Ou beneficia melhor a empresa/cliente que o seu sistema/software atende? Qual lhe traria mais liberdade e facilidade? Como DBA, eu gosto de lidar com alguns bancos de dados específicos e ficar livre com relação às linguagens de programação. Mas como desenvolvedor, seria muito mais fácil se minha aplicação se preocupasse 100% com as regras e validações e eu tenha a liberdade de mudar de banco de dados. As vezes posso começar com um NoSQL, depois eu mudo para um banco relacional e etc.

E sobre sua 2 pergunta, na minha opinião, desde que você tenha documentado e em algum lugar visível e de fácil acesso o descritivo de cada erro, acho super válido. Não é o mesmo que temos em diversos sistemas? Erro 500, Erro 404, Erro e1004 e etc?

Espero ter ajudado. Abraços.

Valeu Daniel, ajudou muito!