Criação de log de ações através do banco - PostgreSQL

27
Marcos Thomaz da Silva Criação de Log de Ações Através do Banco de Dados

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 of Criação de log de ações através do banco - PostgreSQL

Page 1: Criação de log de ações através do banco - PostgreSQL

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

• 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

• “...é 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

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

Inserção Alteração Exclusão

Insert Update Delete

Page 6: Criação de log de ações através do banco - PostgreSQL

• “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
Page 8: Criação de log de ações através do banco - PostgreSQL

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

Como gerar o log?

Page 10: Criação de log de ações através do banco - PostgreSQL

Passo 1. Criar uma tabela para armazenar as informações

Page 11: Criação de log de ações através do banco - PostgreSQL

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

Passo 3. Atribuir as trigger functions aos eventos

Page 13: Criação de log de ações através do banco - PostgreSQL

Testando as ações

Page 14: Criação de log de ações através do banco - PostgreSQL

Verificando a tabela de Log

Page 15: Criação de log de ações através do banco - PostgreSQL

• 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

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

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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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 27: Criação de log de ações através do banco - PostgreSQL

Obrigado!

Dúvidas??

Marcos [email protected]