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
