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
