criação de log de ações através do banco - postgresql
DESCRIPTION
Esta apresentação foi utilizada na palestra ministrada na Conferência Brasileira de PostgreSQL, realizada na cidade de Porto Velho - Rondônia - Brasil, em 2013. Ela apresenta uma forma simples de se manter o log das ações realizadas no banco de dados, mantendo um histórico de modificações.TRANSCRIPT
![Page 1: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/1.jpg)
Marcos Thomaz da Silva
Criação de Log de Ações Através do Banco de Dados
![Page 2: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/2.jpg)
• Graduação em Sistemas de Informação
• Especialização em Bancos de Dados
• Analista de Tecnologia da Informação da Universidade Federal do Acre
• Desenvolvedor Clipper, Delphi, PHP e Python
• Participante e Moderador da Lista Django Brasil;
• Entusiasta PostgreSQL
• Sócio da Empresa Hydros Consultoria
Perfil do Instrutor
![Page 3: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/3.jpg)
• “...é uma expressão utilizada para descrever o processo de registro de eventos relevantes num sistema computacional. ”1. Cadastro de um Cliente;
2. Alteração do Preço de um Produto;
3. Inserção de uma disciplina a um Curso;
4. Modificação da Nota de um Aluno;
5. Lançamento de uma Venda;
6. Pagamento de uma Conta;
7. Exclusão de um Produto;
O que são logs?
![Page 4: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/4.jpg)
Inicia Lançamento da Venda
Efetua a Baixa do Estoque dos Produtos
Finaliza Lançamento da Venda
Recupera Informações (Consulta Estoque)
SELECT
Altera Estoque dos ProdutosUPDATE
Insere a vendaINSERT
![Page 5: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/5.jpg)
Inserção Alteração Exclusão
Insert Update Delete
![Page 6: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/6.jpg)
• “Esse registro pode ser utilizado para restabelecer o estado original de um sistema ou para que um administrador conheça o seu comportamento no passado.”
![Page 7: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/7.jpg)
![Page 8: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/8.jpg)
Estrutura das triggers
Outros Bancos de Dados
Tabela
Trigger
PostgreSQL
Tabela
Trigger Function
![Page 9: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/9.jpg)
Como gerar o log?
![Page 10: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/10.jpg)
Passo 1. Criar uma tabela para armazenar as informações
![Page 11: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/11.jpg)
Passo 2. Criar as trigger’s que armazenem a informação
![Page 12: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/12.jpg)
Passo 3. Atribuir as trigger functions aos eventos
![Page 13: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/13.jpg)
Testando as ações
![Page 14: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/14.jpg)
Verificando a tabela de Log
![Page 15: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/15.jpg)
• Foram criadas 3 functions (uma para cada evento);
• Foram criadas 3 triggers (uma cada cada evento);
• No total, para uma única tabela criamos 6 objetos!
O que fazer???
Bom né?.. Será?
![Page 16: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/16.jpg)
Variáveis Especiais
VARIÁVEL DESCRIÇÃO
NEW Tipo RECORD que contém o Novo valor dos campos de uma tabela (Insert / Update)
OLD Tipo RECORD que contém os valores antigos de Campos (Update/Delete)
TG_OP String indicando a operação (INSERT, UPDATE, DELETE, TRUNCATE)
TG_RELNAME / TG_TABLE_NAME Nome da tabela envolvida
![Page 17: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/17.jpg)
Novo Código
Agora temos apenas uma function e uma trigger para cada tabela
![Page 18: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/18.jpg)
• E se tivermos muitas tabelas??? (800 por exemplo);
• Usar a variável TG_TABLE_NAME / TG_REL_NAME?; >>
• A estrutura da tabela de log como está, atende a todas as situações?
Será?
Conseguimos visualizar quais eram os valores antigos do registro id_log=6??
![Page 19: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/19.jpg)
• Como criar algo que sirva para todas as tabelas do banco??
• Como saber quando foi executado e por quem?
• Nos casos de Update, como armazenar os valores novos e os antigos??
• Como automatizar o processo de vínculo da(s) trigger(s) de log com as tabelas do banco?
Novos problemas surgiram....
![Page 20: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/20.jpg)
• Valores NEW e OLD são do tipo Record (podem ser percorridos);
• Podemos pensar em realizar cast;
• Podemos avaliar o tipo da operação (insert, update, delete);
• Podemos avaliar de qual tabela está originando a instrução;
• Podemos pegar os valores do usuário corrente e de data / hora;
E o PostgreSQL novamente tem a solução!
![Page 21: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/21.jpg)
• Repensando na tabela de log...▫ Criar um campo para armazenar o nome da tabela;
▫ Criar um campo para armazenar a data/hora da ocorrência;
▫ Criar um campo para armazenar o usuário;
▫ Armazenar valores de OLD e NEW;
Resolvendo os problemas...
![Page 22: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/22.jpg)
• Repensando a function que grava o log;▫ Pegar o nome da tabela;
▫ Pegar os dados de OLD e NEW;
Resolvendo os problemas...
![Page 23: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/23.jpg)
• Automatizando o processo de instalação da auditoria para todas as tabelas do banco de dados▫ Listar as tabelas gerando os comandos de criação de tabelas;
Resolvendo os problemas...
![Page 24: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/24.jpg)
• Criar a tabela de log em um tablespace separado.
• Criar um índice que permita a busca dos dados na tabela de log (FullText Search???);
• Criar (pelo menos) um schema separado para armazenar a trigger global e as functions auxiliares;
Recomendações importantes
![Page 25: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/25.jpg)
• Não utilize o usuário postgres para o banco. Prefira criar um usuário específico para o acesso;
• Não dê permissões de exclusão da tabela de log (delete ou drop) para os usuários comuns de acesso a base (preferencialmente, permita apenas a operação de inserção – insert);
Não esquecendo da segurança
![Page 26: Criação de log de ações através do banco - PostgreSQL](https://reader031.vdocuments.mx/reader031/viewer/2022013102/546fcc8ab4af9f3a0b8b46c6/html5/thumbnails/26.jpg)
• http://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html
• http://pt.wikipedia.org/wiki/Log_de_dados
Referências