Bom Dia, estou com mais uma dúvida aqui,desta vez é sobre Auditoria…
Bom, meu professor pediu pra mim criar essa classe para o meu sistema aqui…Aonde qualquer funcionario que inserir ou alterar no sistema, ele seja auditado…porém eu nao sei como fazer isso, ele me disse que não precisa criar servlet e nem usar o Hibernate, falou que eu só preciso instanciar o objeto dele la no servlet da tal pagina…exemplo…GerenciarClientes(esse é o servlet do cliente)…ai no Inserir, eu colocar o objeto da Auditoria la…ai quando eu entrar com o funcionario e inserir um cliente…vai criar um log na tabela Auditoria…e é ai que eu n sei como fazer isso…
Para seu sistema ter uma auditoria não é tão complexo. Se vc está utilizando banco de dados, basta criar uma tabela chamada AUDITORIA, com as colunas que vc está pretendendo gravar (usuário, data, por exemplo) e, quando o usuário tentar alterar ou inserir alguma informação, vc implementa um “insert into” que pegue as informações que vc precisa e executa logo após obter sucesso em inserir ou alterar uma informação. Algo como:
Usa trigger direto no banco. Fazer pelo programa, ainda mais em Java, seja com ou sem Hibernate as chances de furo são bem maiores, quase que uma auditoria amadora.
Eu tinha dado uma olhada nesse Trigger, neste caso aqui, não precisa ser algo assim tão profissional…ele é apenas para mostrar no meu tcc do curso técnico…contando que esteja funcionando, já é algo bom…Mas vlw mesmo assim
Obrigado, pena que infelizmente não está funcionando…
Esse é o codigo no Servlet de uma classe chamada GerenciarPlano, que é planos de pagamento…
No caso é na parte de Inserir…
case "inserir" a.setAcao(("Inseriu o Cliente:"+p.getNome())); Funcionario f = (Funcionario) session.getAttribute("funcionario"); a.setFuncionario(f); p.inserir(); break;
E aqui é a DAO da Auditoria
public class AuditoriaDAO extends DataBaseDAO{ public void inserir(Auditoria a) throws Exception{ String sql="INSERT INTO auditoria (acao, now(), funcionario_id) VALUES(?,?,?)"; this.conectar(); PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, a.getAcao()); pstm.setInt(2, a.getFuncionario().getId()); pstm.execute(); this.desconectar(); }
Mas, na hora em que eu vou inserir algo nesta tabela, ela inseri normal, mas nao manda os dados pra tabela de auditoria…
Vc está tentando executar a inserção com 3 question marks, quando deveriam ser apenas 2:
Errado, pois now() é uma função do DB, portanto não precisa de marcação: INSERT INTO auditoria (acao, now(), funcionario_id) VALUES(?,?,?)
Logo:
Certo, pois somente acao e funcionario_id são parametros a serem marcados:
INSERT INTO auditoria (acao, now(), funcionario_id) VALUES(?,?)
Por fim, ficaria desta forma:
public class AuditoriaDAO extends DataBaseDAO{
public void inserir(Auditoria a) throws Exception{
//deve passar apenas 2 question marks, sendo now() uma função do DB
String sql="INSERT INTO auditoria (acao, now(), funcionario_id) VALUES(?, ?)";
this.conectar();
PreparedStatement pstm = conn.prepareStatement(sql);
//param 1
pstm.setString(1, a.getAcao());
//param 2
pstm.setInt(2, a.getFuncionario().getId());
pstm.execute();
this.desconectar();
}
Fiz do jeito que você instruiu…Mas ele ainda não quer mandar pra tabela Auditoria, não sei o por que
Ele inseriu normal, mas é como se tivesse ignorado essa tabela…
Vou mandar o switch todo desta parte…
`` switch (op) {
case "inserir":
a.setAcao(("Inseriu o Plano:"+p.getNome()));
Funcionario f = (Funcionario)
session.getAttribute("funcionario"); `Essa parte é pegando a sessão do funcionario logado`
a.setFuncionario(f);
p.inserir();
break;
case "alterar":
p.alterar();
break;
case "excluir":
p.excluir();
break;
}
response.sendRedirect("plano_de_pagamento.jsp");
Creio que falta vc passar o objeto por parametro nesse metodo. Uma forma de vc saber qual é o erro e lançar a exceção na hora da execução do método. Assim, fica mais fácil de saber se tem algum problema e onde ele está.
Vc lança a exception? Se não, faça seu método lançar e coloque o trace aqui para a comunidade poder analisar.
Olhando só o que vc passou, o que percebi é que o objeto acao não está sendo passado para o método.
deu esse erro aqui.
Erro: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘now(), funcionario_id) VALUES(‘Inseriu o Plano:Semestral’,4)’ at line 1
INSERT INTO auditoria (acao, seu_campo_data, funcionario_id) VALUES(?, ?, ?)
E nos question marks, coloque 3 assim:
//param 1
pstm.setString(1, a.getAcao());
//param 2
pstm.setString(2, "now()");//veja a doc do MySQL pra saber qual é a melhor função pra vc
//param 3
pstm.setInt(3, a.getFuncionario().getId());
AnualDuracao de 1 ano500.04Erro: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: ‘now()’ for column ‘data_hora’ at row 1
Isso ai seria por que no meu banco de dados o campo data_hora está como datetime ?