Pedro afinal aparece a hora, lapso meu. No entanto no campo 'campos' não aparece apenas aquele que editei mas sim todos, sabes porque?
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
