Caro Pedro,

Muito obrigado. Vou estudar direitinho e experimentar...

depois comunico


abraço







On 01-09-2011 12:51, Pedro Cavalheiro wrote:
> 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

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a