none
log de atividades com banco de dados RRS feed

  • 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 hora

    Administrador | 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
    terça-feira, 13 de novembro de 2012 00:43

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())
                       

    quarta-feira, 14 de novembro de 2012 21:42

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

    terça-feira, 13 de novembro de 2012 13:36
    Moderador
  • Eu uso o MYSQL..

    acesso os dados assim:

    Dim con As New MySqlConnection("server=localhost;user Id=root;password=admin;database=workshopmanager")

    terça-feira, 13 de novembro de 2012 15:13
  • 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

    terça-feira, 13 de novembro de 2012 15:19
    Moderador
  • 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

    terça-feira, 13 de novembro de 2012 16:45
  • 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


    terça-feira, 13 de novembro de 2012 17:03
    Moderador
  • nao.. na verdade nao fiz nada... nao sei como fazer essa tabela e como inserir nela...

    terça-feira, 13 de novembro de 2012 17:41
  • 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

    terça-feira, 13 de novembro de 2012 17:53
    Moderador
  • 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..

    terça-feira, 13 de novembro de 2012 18:27
  • 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


    terça-feira, 13 de novembro de 2012 18:37
    Moderador
  • mas tipow.. o tipo dos campos vao ser oq? varchar, integer ??
    terça-feira, 13 de novembro de 2012 18:49
  • No seu exemplo tambem esta a resposta:

    Usuario          | Ação   | tabela  |  coluna                             |  data hora

    Administrador | 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


    terça-feira, 13 de novembro de 2012 18:59
    Moderador
  • 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 ??

    quarta-feira, 14 de novembro de 2012 02:52
  • 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

    quarta-feira, 14 de novembro de 2012 03:33
    Moderador
  • Caso queira, pode criar uma trigger para auditar os dados.

    Veja um exemplo neste link:

    http://leonelfraga.com/neomatrixtech/index.php/auditando-alteracoes-de-dados-no-sql-server-de-forma-simples/

    Att.,

    Jeimes Ribeiro

    quarta-feira, 14 de novembro de 2012 11:58
  • 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())
                       

    quarta-feira, 14 de novembro de 2012 21:42