Criação de log de ações através do banco
-
Upload
marcos-thomaz -
Category
Documents
-
view
76 -
download
1
Transcript of Criação de log de ações através do banco
Marcos Thomaz da Silva
Criação de Log de Ações Através do Banco de Dados
• 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
• “...é 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?
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
Inserção Alteração Exclusão
Insert Update Delete
• “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.”
Estrutura das triggers
Outros Bancos de Dados
Tabela
Trigger
PostgreSQL
Tabela
Trigger Function
Como gerar o log?
Passo 1. Criar uma tabela para armazenar as informações
Passo 2. Criar as trigger’s que armazenem a informação
Passo 3. Atribuir as trigger functions aos eventos
Testando as ações
Verificando a tabela de Log
• 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á?
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
Novo Código
Agora temos apenas uma function e uma trigger para cada tabela
• 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??
• 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....
• 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!
• 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...
• Repensando a function que grava o log;▫ Pegar o nome da tabela;
▫ Pegar os dados de OLD e NEW;
Resolvendo os problemas...
• 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...
• 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
• 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
• http://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html
• http://pt.wikipedia.org/wiki/Log_de_dados
Referências