Usuário com melhor resposta
log de atividades com banco de dados

Pergunta
-
Pessoal, queria saber como posso fazer um log de atividades com açoes no banco: insert, delete update...
Fazer um form onde nele é registrado todas as açoes feitas com o banco, para se ter um controle.. por exemplo:
Usuario | Ação | tabela | coluna | data horaAdministrador | INSERT | Cliente | codigo 1 nome Bruno Gomes | 12/11/2012 22:43
valeeu..
- Editado brunaum15 terça-feira, 13 de novembro de 2012 01:14
Respostas
-
Consegui resolver!! Vou postar para ajudar alguem que tbm precise.
Estou usando esse banco:create table mapalog ( cod_mapalog bigint(5), tipousuario_mapalog varchar(30), usuario_mapalog varchar(30), data_mapalog varchar(10), hora_mapalog time, descricao_mapalog varchar(200) ); alter table mapalog add constraint pk_cod_mapalog_cod_mapalog primary key (cod_mapalog); alter table mapalog modify cod_mapalog bigint(5) auto_increment not null; delimiter $$ create procedure usp_mapalog_insert ( _tipousuario_mapalog varchar(30), _usuario_mapalog varchar(30), _data_mapalog varchar(10), _hora_mapalog time, _descricao_mapalog varchar(300) ) Begin Insert into mapalog ( tipousuario_mapalog, usuario_mapalog, data_mapalog, hora_mapalog, descricao_mapalog ) values ( _tipousuario_mapalog, _usuario_mapalog, _data_mapalog, _hora_mapalog, _descricao_mapalog ); end $$ delimiter ; delimiter $$ create procedure usp_mapalog_select() begin select * from mapalog; end $$ delimiter ;
E fiz um form com um datagrid, com esses codigos:
Public Class frm_Log Private Sub frm_Log_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DataGridView1.DataSource = Nothing DataGridView1.DataSource = carregarDataGridView1().Copy() DataGridView1.Columns(0).HeaderText = "Código" DataGridView1.Columns(0).Visible = False DataGridView1.Columns(1).HeaderText = "Tipo de Usuário" DataGridView1.Columns(1).Visible = True DataGridView1.Columns(1).Width = 80 DataGridView1.Columns(2).HeaderText = "Usuário" DataGridView1.Columns(2).Visible = True DataGridView1.Columns(2).Width = 120 DataGridView1.Columns(3).HeaderText = "Data" DataGridView1.Columns(3).Visible = True DataGridView1.Columns(3).Width = 80 DataGridView1.Columns(4).HeaderText = "Hora" DataGridView1.Columns(4).Visible = True DataGridView1.Columns(4).Width = 80 DataGridView1.Columns(5).HeaderText = "Descrição" DataGridView1.Columns(5).Visible = True DataGridView1.Columns(5).Width = 420 End Sub Private Function carregarDataGridView1() As DataTable Dim conn As New MySqlConnection("server=localhost;User Id=root;password=admin;Persist Security Info=True;database=workshopmanager") Dim cmd As New MySqlCommand("USP_MAPALOG_SELECT", conn) Dim dt As New DataTable cmd.CommandType = CommandType.StoredProcedure Try conn.Open() dt.Load(cmd.ExecuteReader()) Return dt Catch ex As Exception Throw ex Finally If conn.State <> ConnectionState.Closed Then conn.Close() End If End Try End Function Public Sub escreverLog(ByVal tipousuario As String, ByVal usuario As String, ByVal data As String, ByVal hora As TimeSpan, ByVal descricao As String) Dim conn As New MySqlConnection("server=localhost;User Id=root;password=admin;Persist Security Info=True;database=workshopmanager") Dim cmd As New MySqlCommand("USP_MAPALOG_INSERT", conn) cmd.Parameters.Add(New MySqlParameter("_tipousuario_mapalog", tipousuario)) cmd.Parameters.Add(New MySqlParameter("_usuario_mapalog", usuario)) cmd.Parameters.Add(New MySqlParameter("_data_mapalog", data)) cmd.Parameters.Add(New MySqlParameter("_hora_mapalog", hora)) cmd.Parameters.Add(New MySqlParameter("_descricao_mapalog", descricao)) cmd.CommandType = CommandType.StoredProcedure Try conn.Open() cmd.ExecuteNonQuery() Catch ex As Exception Throw ex Finally If conn.State <> ConnectionState.Closed Then conn.Close() End If End Try End Sub
E na hora do insert, exclusao e alteracao usei essa linha. Só mudando o texto conforme o tipo da ação.
frm_Log.escreverLog(frm_Usuario.ToolStripStatusLabel1.Text, frm_Usuario.ToolStripStatusLabel2.Text, DateTime.Now.ToString("d"), Now.TimeOfDay, "EXCLUSÃO DO CLIENTE DE NOME: " + txt_Nome.Text.Trim())
- Sugerido como Resposta William John Adam TrindadeModerator quinta-feira, 15 de novembro de 2012 13:50
- Marcado como Resposta Levi DomingosModerator sexta-feira, 16 de novembro de 2012 18:09
Todas as Respostas
-
Eu respondi uma questao identica outro dia (no forum C#)
http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/a6d6dd47-c9e4-4a71-beba-96132794278e
O que precisamos saber é como vc implementou sua camada de acesso a dados.. sem isso fica dificil dar uma resposta precisa.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée -
-
Ok.. isso é a base e sua conexao.. mas como vc faz os inserts /updates/deletes (CRUD) do seu sistema.
Para criar um log vc tem duas alternativas basicas: Ou fa isso no codigo ou faz isso no banco.
O metodo que eu descrevi era para fazer o log usando o codigo e para isso vc tem que ter o DAL (camada de acesso a dados) bem definida.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée -
Um exemplo de insert:
Dim con As New MySqlConnection("server=localhost; user id=root; password=admin; database=workshopmanager") Dim cmd As New MySqlCommand Dim reader As MySqlDataReader cmd = con.CreateCommand con.Open() With cmd .CommandType = CommandType.Text .CommandText = "INSERT INTO servico (nome_Servico, valor_Servico, descricao_Servico) VALUES (@nome, @valor, @descricao)" .Parameters.Add("@nome", MySqlDbType.VarChar) .Parameters("@nome").Value = Trim(txt_Nome.Text) .Parameters.Add("@valor", MySqlDbType.VarChar) .Parameters("@valor").Value = Trim(txt_Valor.Text) .Parameters.Add("@descricao", MySqlDbType.VarChar) .Parameters("@descricao").Value = Trim(txt_descricao.Text) cmd.ExecuteNonQuery() .CommandText = "SELECT cod_Servico FROM servico WHERE nome_Servico = @nome" reader = cmd.ExecuteReader reader.Read() codServico = reader.GetString("cod_Servico") lbl_cod.Text = codServico MessageBox.Show("Serviço cadastrado com sucesso!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information) atualizarform() CManager.Position = CManager.Count - 1 lbl_Registros.Text = (CManager.Position + 1) & " de " & CManager.Count con.Close() End With End If
e delete:
If MsgBox("Deseja realmente excluir este Serviço?", MsgBoxStyle.OkCancel, "Confirmação") = MsgBoxResult.Ok Then Dim con As New MySqlConnection("server=localhost;user Id=root;password=admin;database=workshopmanager") Dim cmd As New MySqlCommand() Dim reader As MySqlDataReader con.Open() Try cmd = con.CreateCommand With cmd .CommandType = System.Data.CommandType.Text .CommandText = "SELECT cod_servico FROM servico WHERE cod_servico = " & lbl_cod.Text & "" End With reader = cmd.ExecuteReader If reader.Read() Then codServico = reader("cod_Servico") reader.Close() End If With cmd .CommandType = CommandType.Text .CommandText = "DELETE FROM servico WHERE cod_Servico = @codser" .Parameters.Add("@codser", MySqlDbType.Int32) .Parameters("@codser").Value = codServico End With If cmd.ExecuteNonQuery = 1 Then apagarTextBoxs() btnPadrao() MsgBox("Exclusão Feita com Sucesso!", MsgBoxStyle.Information, "Concluido") atualizarform() CManager.Position += 1 lbl_Registros.Text = (CManager.Position + 1) & " de " & CManager.Count Else MsgBox("O cadastro não foi excluido, verifique!", MsgBoxStyle.Exclamation, "Tente Novamente") End If con.Close() Catch MsgBox("Erro ao tentar excluir", MsgBoxStyle.Critical, "ERRO") End Try End If
-
OK.. voce nao tem um DAL..
Isso vai tornar as coisas um pouco mais trabalhosas..
Vc ja criou sua tabela de Log? Qual é a dificuldade de inserir um registro cada vez que vc faz um inset/update/delete?
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator terça-feira, 13 de novembro de 2012 17:04
-
-
E o codigo que vc mostrou? Foi vc quem fez? Se não foi, pelo menos consegue entende-lo?
Vai ser dificil te explicar como criar uma tabela de log se vc nao souber o basico.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée -
siim o código que te passei é meu... pois estou com um programa feito de cadastros...
Mas ai quis tentar fazer esse log para colocar no programa..
Mas a tabela q vc ta falando de log, é no banco de dados n é? n sei como posso faze-la, quais campos, etc..
-
Entao... Voce ja definiu os campos no seu post:
Usuario| Ação |tabela|coluna|data hora
Voc vai criar uma tabela exatamente com estes campos e a cada operaçao vc vai inserir um item nela exatamente como se fosse um cadastro.
Vc nao sabe criar tabelas? Quem criou as tabelas do programa que vc fez?
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator terça-feira, 13 de novembro de 2012 18:37
-
-
No seu exemplo tambem esta a resposta:
Usuario | Ação | tabela | coluna | data horaAdministrador | INSERT | Cliente | codigo 1 nome Bruno Gomes | 12/11/2012 22:43
A naso ser que nao seja isso o que vc queira armazenar.
Todos serao varchar exceto datahora que ser um datetime (ou timestamp)
att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator terça-feira, 13 de novembro de 2012 19:00
-
desculpa pela demoraa...
aqui criei a tabela:
create table log ( cod_log varchar(100) not null, acao_log varchar(100) not null, tabela_log varchar(100) not null, coluna_log varchar(100) not null, datahora_log datetime not null);
agora toda vez q eu for fazer insert, delete ou update.. eu vou ter q fazer um insert nessa tabela ??
-
Sim
Sugiro criar uma funçao e chamar ela onde vc tem necessidade de log.
Use o codigo para o insert
public sub GravaLog(cod,acao,tabela) With cmd .CommandType = CommandType.Text .CommandText = "INSERT INTO log(cod_log, acao_log, tabela_log) VALUES (@cod, @acao, @tabela)" .Parameters.Add("@cod", MySqlDbType.VarChar) .Parameters("@cod").Value = Trim(cod) .Parameters.Add("@acao", MySqlDbType.VarChar) .Parameters("@acao").Value = Trim(acao) .Parameters.Add("@tabela", MySqlDbType.VarChar) .Parameters("@tabela").Value = Trim(tabela) cmd.ExecuteNonQuery() end sub
eu nao coloquei todos os campos... é só para dar uma idéia do que vc tem que fazer.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Sugerido como Resposta William John Adam TrindadeModerator quinta-feira, 15 de novembro de 2012 13:48
-
Caso queira, pode criar uma trigger para auditar os dados.
Veja um exemplo neste link:
Att.,
Jeimes Ribeiro
-
Consegui resolver!! Vou postar para ajudar alguem que tbm precise.
Estou usando esse banco:create table mapalog ( cod_mapalog bigint(5), tipousuario_mapalog varchar(30), usuario_mapalog varchar(30), data_mapalog varchar(10), hora_mapalog time, descricao_mapalog varchar(200) ); alter table mapalog add constraint pk_cod_mapalog_cod_mapalog primary key (cod_mapalog); alter table mapalog modify cod_mapalog bigint(5) auto_increment not null; delimiter $$ create procedure usp_mapalog_insert ( _tipousuario_mapalog varchar(30), _usuario_mapalog varchar(30), _data_mapalog varchar(10), _hora_mapalog time, _descricao_mapalog varchar(300) ) Begin Insert into mapalog ( tipousuario_mapalog, usuario_mapalog, data_mapalog, hora_mapalog, descricao_mapalog ) values ( _tipousuario_mapalog, _usuario_mapalog, _data_mapalog, _hora_mapalog, _descricao_mapalog ); end $$ delimiter ; delimiter $$ create procedure usp_mapalog_select() begin select * from mapalog; end $$ delimiter ;
E fiz um form com um datagrid, com esses codigos:
Public Class frm_Log Private Sub frm_Log_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DataGridView1.DataSource = Nothing DataGridView1.DataSource = carregarDataGridView1().Copy() DataGridView1.Columns(0).HeaderText = "Código" DataGridView1.Columns(0).Visible = False DataGridView1.Columns(1).HeaderText = "Tipo de Usuário" DataGridView1.Columns(1).Visible = True DataGridView1.Columns(1).Width = 80 DataGridView1.Columns(2).HeaderText = "Usuário" DataGridView1.Columns(2).Visible = True DataGridView1.Columns(2).Width = 120 DataGridView1.Columns(3).HeaderText = "Data" DataGridView1.Columns(3).Visible = True DataGridView1.Columns(3).Width = 80 DataGridView1.Columns(4).HeaderText = "Hora" DataGridView1.Columns(4).Visible = True DataGridView1.Columns(4).Width = 80 DataGridView1.Columns(5).HeaderText = "Descrição" DataGridView1.Columns(5).Visible = True DataGridView1.Columns(5).Width = 420 End Sub Private Function carregarDataGridView1() As DataTable Dim conn As New MySqlConnection("server=localhost;User Id=root;password=admin;Persist Security Info=True;database=workshopmanager") Dim cmd As New MySqlCommand("USP_MAPALOG_SELECT", conn) Dim dt As New DataTable cmd.CommandType = CommandType.StoredProcedure Try conn.Open() dt.Load(cmd.ExecuteReader()) Return dt Catch ex As Exception Throw ex Finally If conn.State <> ConnectionState.Closed Then conn.Close() End If End Try End Function Public Sub escreverLog(ByVal tipousuario As String, ByVal usuario As String, ByVal data As String, ByVal hora As TimeSpan, ByVal descricao As String) Dim conn As New MySqlConnection("server=localhost;User Id=root;password=admin;Persist Security Info=True;database=workshopmanager") Dim cmd As New MySqlCommand("USP_MAPALOG_INSERT", conn) cmd.Parameters.Add(New MySqlParameter("_tipousuario_mapalog", tipousuario)) cmd.Parameters.Add(New MySqlParameter("_usuario_mapalog", usuario)) cmd.Parameters.Add(New MySqlParameter("_data_mapalog", data)) cmd.Parameters.Add(New MySqlParameter("_hora_mapalog", hora)) cmd.Parameters.Add(New MySqlParameter("_descricao_mapalog", descricao)) cmd.CommandType = CommandType.StoredProcedure Try conn.Open() cmd.ExecuteNonQuery() Catch ex As Exception Throw ex Finally If conn.State <> ConnectionState.Closed Then conn.Close() End If End Try End Sub
E na hora do insert, exclusao e alteracao usei essa linha. Só mudando o texto conforme o tipo da ação.
frm_Log.escreverLog(frm_Usuario.ToolStripStatusLabel1.Text, frm_Usuario.ToolStripStatusLabel2.Text, DateTime.Now.ToString("d"), Now.TimeOfDay, "EXCLUSÃO DO CLIENTE DE NOME: " + txt_Nome.Text.Trim())
- Sugerido como Resposta William John Adam TrindadeModerator quinta-feira, 15 de novembro de 2012 13:50
- Marcado como Resposta Levi DomingosModerator sexta-feira, 16 de novembro de 2012 18:09