1. Marcos Thomaz da Silva
Criação de Log de Ações Através do Banco de
Dados
2. • 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
3. • “...é 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?
4. 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
Produtos
UPDATE
Insere a venda
INSERT
6. • “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.”
15. • 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á?
16. 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
18. • 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??
19. • 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....
20. • 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!
21. • 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...
22. • Repensando a function que grava o log;
▫ Pegar o nome da tabela;
▫ Pegar os dados de OLD e NEW;
Resolvendo os problemas...
23. • 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...
24. • Criar a tabela de log em um tablespace separado.
• Criar um índice que permita a busca dos dados na tabela de log (Full
Text Search???);
• Criar (pelo menos) um schema separado para armazenar a trigger global
e as functions auxiliares;
Recomendações importantes
25. • 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