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

Responder a