Pedro só mais uma coisa,
seria ideal o trigger disparar por cada tabela da base de dados uma vez
que nem sempre os nomes são iguais, será que sabes como fazer isso? e
que apareça um novo campo chamado "tabela" para que seja possível saber
a alteração a que tabela se refere...
obrigado pela sua ajuda
On 01-09-2011 15:08, Pedro Cavalheiro wrote:
> Olá,
>
> sim, é necessário criar uma tabela, conforme comentei na resposta com
> os comandos:
>>>>> 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);
> A tabela deste exemplo seria "tabela_de_logs" com os campos
> data_alteracao, usuario, campos, dados_novos, dados_antigos.
> Poder ser todos tipo varchar ou text, ou se preferir padronizar, use
> date para data_alteração e crie uma coluna id como primary key.
>
> Seria interessante ler os nomes referenciados em todo o script
> (tabelas, campos) para preparar o que for necessário antes de criar a
> trigger/function.
>
> Atenciosamente,
> Pedro Cavalheiro
>
> Em 1 de setembro de 2011 10:57, Pedro Costa<[email protected]> escreveu:
>> Caro Pedro,
>>
>> Estou a experimentar o trigger.. Dá-me um erro que diz "tabela de logs
>> não existe". Suponho que seria bom inserir uma expressão que crie a
>> tabela certo?
>>
>> QUe tipo de campos teria a tabela?
>>
>> obrigado
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On 01-09-2011 13:02, Pedro Cavalheiro wrote:
>>> Sem problemas!
>>>
>>> Comecei a trabalhar com Postgre a pouco tempo, mas sempre que posso
>>> tento compartilhar o que já sei.
>>>
>>> Neste caso, é utilizada a linguagem plpgsql, que precisa estar ativa
>>> no seu servidor. No caso dê dar algum erro do tipo "Language plpgsql
>>> does not exist", basta usar o comando 'create language plpgsql'
>>>
>>> O exemplo que te passei é bem simples. Dá pra melhorar muita coisa,
>>> mas como você comentou que está verde ainda, preferi não complicar
>>> muito =)
>>>
>>> Abraços e boa sorte!
>>>
>>> Atenciosamente,
>>> Pedro Cavalheiro
>>>
>>> Em 1 de setembro de 2011 08:58, Pedro Costa<[email protected]>
>>> escreveu:
>>>> 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
>>>>
>>> _______________________________________________
>>> 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