Vou usar um modelo que utilizo em algumas tabelas por aqui:
Criando a trigger para cada tabela:
CREATE TRIGGER nome_da_trigger AFTER INSERT OR UPDATE OR DELETE
ON nome_da_tabela_que_sera_alterada FOR EACH ROW
EXECUTE PROCEDURE nome_da_funcao();
--Nesse caso, utilizei AFTER e FOR EACH ROW para disparar a trigger
após a alteração e executar a function para cada linha.
Criando a função a ser chamada:
CREATE OR REPLACE FUNCTION nome_da_funcao (
)
RETURNS trigger AS'
DECLARE
colunas text [] = null;
BEGIN
-- Verifica se o trigger esta setado como AFTER
IF TG_WHEN = ''BEFORE'' THEN
RAISE EXCEPTION ''Trigger deve ser AFTER'';
END IF;
-- Verifica se o trigger esta setado como FOR EACH ROW
IF TG_LEVEL = ''STATEMENT'' THEN
RAISE EXCEPTION ''Trigger deve ser FOR EACH ROW'';
END IF;
-- Seleciona array de colunas de acordo com nome da tabela,
utilizando o parâmetro TG_RELNAME
colunas := array(
SELECT column_name::text
FROM information_schema.COLUMNS
WHERE table_name = TG_RELNAME);
IF TG_OP = ''INSERT'' THEN
INSERT INTO tabela_de_logs(data_alteracao, usuario, campos, dados_novos)
VALUES (now(), current_user, colunas::text, NEW::text);
END IF;
IF TG_OP = ''DELETE'' THEN
INSERT INTO tabela_de_logs(data_alteracao, usuario, campos, dados_antigos)
VALUES (now(), current_user, colunas::text, OLD::text);
END IF;
IF TG_OP = ''UPDATE'' THEN
INSERT INTO tabela_de_logs(data_alteracao, usuario, campos,
dados_novos, dados_antigos)
VALUES (now(), current_user, colunas::text, NEW::text, OLD::text);
END IF;
RETURN NULL;
END;
'LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
Além de criar a trigger e a function, é necessário criar uma tabela
para salvar os logs, conforme visto em
--INSERT INTO tabela_de_logs(data_alteracao, usuario, campos,
dados_novos, dados_antigos) VALUES (now(), current_user,
colunas::text, NEW::text, OLD::text);
Esse método salva uma linha na tabela de logs para cada INSERT, DELETE
ou UPDATE na tabela algo da trigger. Com essa base é possível criar
algum modo de exportar para um arquivo de texto.
Não cheguei a testar todo esse processo, mas acredito estar fácil de
entender. Antes de criar tudo, altere o nome da
trigger/function/tabela/campos para algo mais "funcional"
Atenciosamente,
Pedro Cavalheiro
Em 1 de setembro de 2011 08:32, Pedro Costa <[email protected]> escreveu:
> Um trigger é uma boa ideia, será que alguém podia ajudar-me a
> escreve-lo? Sozinho nãos serei capaz.
>
> SEria melhor um backup periódico, o pg_dump permitirá isso?
>
>
> obrigado
>
>
>
>
>
>
> On 01-09-2011 12:29, Pedro Cavalheiro wrote:
>> Bom dia, Pedro. Tudo bem?
>>
>> Assim como você, esta é minha primeira participação no grupo, então
>> espero não estar falando bobagem hehehe
>>
>>> No entanto eu gostava de saber se é possível configurar com o pgadmin
>>> III (o cliente que uso) ou pela shell (uso o ubuntu) a criação de um
>>> arquivo log que memorize as alterações que cada utilizador faz e também
>>> a que horas e dia.
>> Acredito que uma alternativa seja criar uma trigger para a tabela em
>> questão, pois ela permite receber os dados antigos e novos da
>> alteração, assim como o usuário atualmente logado no banco. Sobre
>> exportar para um arquivo: geralmente eu gravo meus logs em uma tabela
>> própria para isso, mas talvez seja possível exportar diretamente
>> utilizando algum comando do tipo pg_dump (nunca utilizei, então não
>> posso afirmar).
>>
>>> Pretendia também saber se é possível agendar backups quando alteramos
>>> uma base de dados.
>> Quer um backup para cada alteração, ou um backup periódico de tudo que
>> foi feito/alterado em um intervalo de tempo?
>>
>>
>> Atenciosamente,
>> Pedro Cavalheiro
>>
>>
>> Em 1 de setembro de 2011 07:10, Pedro Costa<[email protected]>
>> escreveu:
>>> Olá a toda a comunidade brasileira de Postgresql..
>>>
>>> Esta é a minha primeira intervenção na lista por isso espero estar a
>>> faze-lo da melhor forma.
>>> A minha dúvida é o seguinte, eu tenho uma base de dados com vários
>>> utilizadores para podermos editar ao mesmo tempo uma mesma tabela (com
>>> base na extensão do qgis).
>>>
>>>
>>> No entanto eu gostava de saber se é possível configurar com o pgadmin
>>> III (o cliente que uso) ou pela shell (uso o ubuntu) a criação de um
>>> arquivo log que memorize as alterações que cada utilizador faz e também
>>> a que horas e dia.
>>>
>>> Pretendia também saber se é possível agendar backups quando alteramos
>>> uma base de dados.
>>>
>>> ALguém pode ajudar?
>>>
>>> Obrigado
>>> _______________________________________________
>>> pgbr-geral mailing list
>>> [email protected]
>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral