Obrigado Pedro. Estive a tentar mas ainda não entendo bem os "arrays"


tenho a função assim se alguém puder inserir as diferenças:


CREATE OR REPLACE FUNCTION funcao_modificacoes (
)
RETURNS trigger AS'
DECLARE
   colunas text [] = null;
BEGIN


   IF TG_WHEN = ''BEFORE'' THEN
     RAISE EXCEPTION ''Trigger deve ser AFTER'';
   END IF;


   IF TG_LEVEL = ''STATEMENT'' THEN
     RAISE EXCEPTION ''Trigger deve ser FOR EACH ROW'';
   END IF;


   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, ''insercao'', NEW::text);
   END IF;

   IF TG_OP = ''DELETE'' THEN
     INSERT INTO tabela_de_logs(data_alteracao, usuario, campos, 
tipo_operacao, dados_antigos)
     VALUES (now(), current_user, colunas::text, ''eliminacao'', OLD::text);
   END IF;

   IF TG_OP = ''UPDATE'' THEN
     INSERT INTO tabela_de_logs(data_alteracao, usuario, campos, 
tipo_operacao,
dados_novos, dados_antigos)
     VALUES (now(), current_user, colunas::text, ''actualizacao'', 
NEW::text, OLD::text);
   END IF;
   RETURN NULL;
END;
'LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


obrigado









On 02-09-2011 15:22, Pedro Cavalheiro wrote:
> O modo que eu vejo mais fácil, é fazer um IF para cada tipo de
> oepração (INSERT, DELETE, UPDATE), usando os atributos da trigger. No
> caso de update, tornar as strings de NEW e OLD em arrays. Fazer um FOR
> para um deles, e comparar ambos (IF valor_antigo[i] != valor_novo[i]),
> concatenando em uma terceira variável apenas os resultados que forem
> diferentes. Deve-se tomar cuidado ao converter em array, pois as
> strings de NEW e OLD podem vir com virgulas consecutivas (como
> comentei antes), e devem ser tratadas.
>
> Atenciosamente,
> Pedro Cavalheiro
>
>
> Em 2 de setembro de 2011 10:35, Pedro Costa<[email protected]>  escreveu:
>> Pedro, isso seria óptimo, será que podes dizer-me como?
>>
>>
>> obrigado
>>
>>
>>
>>
>>
>>
>>
>>
>> On 02-09-2011 13:22, Pedro Cavalheiro wrote:
>>> Entendo... mas você queria gravar os dados neste registro, não é? É
>>> posssível fazer uma repetição para comparar os dados novos e antigos
>>> (no caso de update), gravando apenas o que mudou.
>>>
>>> Atenciosamente,
>>> Pedro Cavalheiro
>>>
>>> Em 2 de setembro de 2011 09:16, Pedro Costa<[email protected]>    
>>> escreveu:
>>>> Obrigado pedro já entendi..já criei para duas tabelas....Só o problema
>>>> que os campos old e new ficam case elegíveis pois o campo das
>>>> coordenadas é mesmo muito longo
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On 02-09-2011 13:11, Pedro Cavalheiro wrote:
>>>>> Pedro,
>>>>>
>>>>>>> seria ideal o trigger disparar por cada tabela da base de dados uma vez
>>>>>>> que nem sempre os nomes são iguais, será que sabes como fazer isso? e
>>>>>>> que apareça um novo campo chamado "tabela" para que seja possível saber
>>>>>>> a alteração a que tabela se refere...
>>>>> Dê uma olhada aqui:
>>>>> http://www.postgresql.org/docs/9.0/static/plpgsql-trigger.html
>>>>> Documentação de triggers com algums parâmetros internos (como nome da
>>>>> tabela alterada, valores antes e depois da alteração, entre outros)
>>>>> É necessário criar uma trigger por tabela.
>>>>>
>>>>>>> Os campos dados_novos e dados_antigos aparecem
>>>>>>> codificados (ou são apenas as cordenadas?)
>>>>> Estas 2 colunas recebem os valores de OLDe NEW da trigger, que são os
>>>>> dados antes e depois da alteração, respectivamente.
>>>>> Os valores são separados por virgula e, se não me engane, no caso de
>>>>> campo vazio o registro fica semelhante a "valor1,,valor3" (2 vírgulas
>>>>> consecutivas, visto que o "valor2" não foi enviado).
>>>>>
>>>>> Atenciosamente,
>>>>> Pedro Cavalheiro
>>>>>
>>>>> Em 1 de setembro de 2011 17:03, Guimarães Faria Corcete DUTRA, Leandro
>>>>> <[email protected]>      escreveu:
>>>>>> 2011/9/1 Osvaldo Kussama<[email protected]>:
>>>>>>> Em 1 de setembro de 2011 12:01, Leandro Guimarães Faria Corce DUTRA
>>>>>>> <[email protected]>      escreveu:
>>>>>>>> Le 2011-S-1  11h13, Pedro Costa a écrit :
>>>>>>>>> No campo da data não aparece a hora, coloquei tipo "date" existe outro
>>>>>>>>> para dar a hora?
>>>>>>>> Datetime.
>>>>>>> Provavelmente você quis dizer: timestamp.
>>>>>> Mea culpa.
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Skype:leandro.gfc.dutra?chat           Yahoo!: ymsgr:sendIM?lgcdutra
>>>>>> +55 (61) 3546 7191             Google Talk: xmpp:[email protected]
>>>>>> +55 (11) 9406 7191      MSNIM:[email protected]
>>>>>> sip:[email protected]             ICQ: AIM:GoIM?screenname=61287803
>>>>>> _______________________________________________
>>>>>> 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

Responder a