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
