none
Como gerar informações sobre quando e quem cadastrou ou atualizou dados no banco RRS feed

  • Pergunta

  • Olá não sei muito bem como perguntar mas vou tentar explicar aqui eu gostaria de saber como faço para gerar informações sobre quem (qual usuário) e quando (data e hora) que um usuário cadastrou ou alterou por exemplo um cliente. Dava pra fazer colocando os campos (cadastradoPor, cadastradoEm, atualizadoPor, atualizadoEm) em cada tabela mas o problema é que isso vai fazer com que cada tabela tenha 4 campos a mais isso vai pesar no banco, de que como forma posso fazer para resolver isso?

    terça-feira, 27 de janeiro de 2015 14:36

Respostas

  • Peço desculpas Matheus, não me atentei a esse detalhe.

    No caso da alteração, deveria ser usado LEFT OUTER JOIN (já que o preenchimento dos campos é opcional):

    SELECT <campos>
    FROM InformacoesTabelas I
    INNER JOIN Usuario UCAD ON UCAD.IdUsuario = I.CadastroPor
    LEFT OUTER JOIN Usuario UALT ON UALT.IdUsuario = I.AtualizadoPor
    WHERE I.IdTabela = 0

    • Sugerido como Resposta Renato GroffeMVP terça-feira, 27 de janeiro de 2015 16:26
    • Marcado como Resposta Matheus PL terça-feira, 27 de janeiro de 2015 16:28
    terça-feira, 27 de janeiro de 2015 16:26

Todas as Respostas

  • Matheus,

    Existem várias maneiras de se fazer isso. Ao menos aqui onde trabalho, costumamos criar uma tabela de Log em que são registradas a tabela modificada, as chaves do registro (incluído, alterado, excluído), o login do usuário (que é obtido de uma aplicação de autenticação própria, portanto sem relação com o login do SQL) e a data/hora em que isso aconteceu.

    A alimentação desta tabela pode ser feita tanto via trigger, quanto através de stored procedures (como muitos sistemas aqui fazem uso de procedures devido ao grande volume de dados, incluímos nestas construções a inclusão nos logs).

    Esta é uma das soluções possíveis.

    Espero ter ajudado.

    Abs

    • Sugerido como Resposta Renato GroffeMVP terça-feira, 27 de janeiro de 2015 16:27
    terça-feira, 27 de janeiro de 2015 14:54
  • Eu estava fazendo uma tabela onde essa possui os seguintes campos:

    IdInformacao INT
    IdTabela INT,
    IdObjeto INT,
    CadastradoEm DATETIME,
    CadastradoPor INT,
    AtualizadoEm DATETIME,
    AtualizadoPor INT
    
    FOREIGN KEY (CadastradoPor) REFERENCES Usuario (IdUsuario),
    FOREIGN KEY (AtualizadoPor) REFERENCES Usuario (IdUsuario)

    onde idInformação é autoincremento idTabela são valores que eu mesmo coloquei para cada tabela ex: tabela usuario = 0. e idObjeto vai ser o id de um produto, funcionário, etc mas o problema maior é quando vou fazer o inner join do usuário por ex:

    SELECT U.IdUsuario, U..., U.NomeUsuario, U..., U..., U..., I.CadastradoPor, -- AQUI SERIA U.NomeUsuario I.CadastradoEm, I.AtualizadoPor, -- AQUI SERIA U.NomeUsuario I.AtualizadoEm FROM Usuario AS U INNER JOIN InformacoesTabelas AS I ON U.IdUsuario = I.IdObjeto

    WHERE IdTabela = 0


    como o campo NomeUsuario já é selecionado, não consigo colocar no lugar de I.CadastradoPor ou I.AtualizadoPor este campo pois para o usuário tem que aparecer o nome do usuário que fez as inserções e alterações mas para essa tabela não consigo fazer isso como eu resolvo?


    • Editado Matheus PL terça-feira, 27 de janeiro de 2015 15:38
    terça-feira, 27 de janeiro de 2015 15:25
  • Vc teria que fazer um JOIN em que a tabela de usuários aparecesse 2 vezes: uma para para quem cadastrou e a outra para quem atualizou.

    Ficaria algo como:

    SELECT <campos>
    FROM InformacoesTabelas I
    INNER JOIN Usuario UCAD ON UCAD.IdUsuario = I.CadastroPor
    INNER JOIN Usuario UALT ON UALT.IdUsuario = I.AtualizadoPor
    WHERE I.IdTabela = 0

    terça-feira, 27 de janeiro de 2015 16:01
  • Obrigado Renato deu certo, mas surgiu outro problema no momento do insert do cliente na procedure ele já insere automaticamente os dados na tabela informaçõestabelas mas ele insere null e null nos campos atualizadoPor, atualizadoEm então como os campos dos registros estavam todos null para atualizar o inner join não funcionou pois não tem códigos em comum como resolvo isso? se tudo estiver preenchido esse inner join funciona
    • Editado Matheus PL terça-feira, 27 de janeiro de 2015 16:11
    terça-feira, 27 de janeiro de 2015 16:10
  • Peço desculpas Matheus, não me atentei a esse detalhe.

    No caso da alteração, deveria ser usado LEFT OUTER JOIN (já que o preenchimento dos campos é opcional):

    SELECT <campos>
    FROM InformacoesTabelas I
    INNER JOIN Usuario UCAD ON UCAD.IdUsuario = I.CadastroPor
    LEFT OUTER JOIN Usuario UALT ON UALT.IdUsuario = I.AtualizadoPor
    WHERE I.IdTabela = 0

    • Sugerido como Resposta Renato GroffeMVP terça-feira, 27 de janeiro de 2015 16:26
    • Marcado como Resposta Matheus PL terça-feira, 27 de janeiro de 2015 16:28
    terça-feira, 27 de janeiro de 2015 16:26
  • Desculpas peço eu por estar perguntando tanto assim, obrigado novamente Renato!!
    terça-feira, 27 de janeiro de 2015 16:28