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

Responder a