Obrigado Jota, mas no seu exemplo eu vejo como atribuir um valor a chave
primária da tabela que disparou exemplo. Eu eu não analisei direito.

Em 9 de novembro de 2011 12:13, JotaComm <[email protected]> escreveu:

> Olá, Marllos
>
> Não entendi muito bem o que você quer, mas fiz um código rápido aqui, mas
> veja se ajuda:
>
>
> Em 9 de novembro de 2011 11:17, Marllos <[email protected]>escreveu:
>
> Obrigado JotaComm
>>
>> No firebird, eu tenho que fazer uma trigger para cada tabela. No
>> Postgresql eu percebi (se não estou enganado) que eu posso usar a mesma
>> função de trigger em várias tabelas e é isso que estou tentando fazer.
>>
>> a minha função de trigger seria
>>
>> create or replace function *gerar_id()* returns trigger as $$
>> begin
>>   --essa trigger define a chave primária
>>   --as tabelas que vão disparar essa trigger são tabela1, tabela2,
>> tabela3, ... (muitas)
>>   --essas tabelas já existem e cada uma tem uma chave primária, do mesmo
>> tipo, mas com nomes diferentes
>>
>> new.(nome da chave primária da tabela que está disparando essa trigger) =
>> uuid_generate_v4()
>>
>> end
>> $$ language plpgsql;
>>
>
> CREATE OR REPLACE FUNCTION f_teste()
>
> RETURNS TRIGGER AS $$
>
> DECLARE
>
>     nome_da_tabela VARCHAR:=NULL;
>
>     chave_primaria VARCHAR:=NULL;
>
>     atributo_chave_primaria VARCHAR:=NULL;
>
> BEGIN
>
>     SELECT pg_class.relname,
>
>     pg_attribute.attname,
>
>     pg_constraint.conname
>
>     INTO nome_da_tabela,
>
>     chave_primaria,
>
>     atributo_chave_primaria
>
>     FROM pg_class JOIN pg_attribute ON pg_class.oid=pg_attribute.attrelid
>
>     JOIN pg_constraint ON pg_class.oid=pg_constraint.conrelid
>
>     WHERE pg_class.relname=TG_TABLE_NAME
>
>     AND pg_attribute.attnum>0
>
>     AND pg_constraint.contype='p';
>
>     RAISE NOTICE 'Tabela: % - Nome do atributo: % - Nome da chave
> primaria: %',nome_da_tabela,chave_primaria,atributo_chave_primaria;
>
>     RETURN NEW;
>
> END;
>
> $$ LANGUAGE PLPGSQL;
>
>>
>> Agora eu quero usar essa trigger em várias tabelas:
>>
>> create tigger tabela1_tg before insert on tabela1
>> for each row execute *gerar_id()*;
>>
>> create tigger tabela2_tg before insert on tabela2
>> for each row execute *gerar_id()*;
>>
>> create tigger tabela3_tg before insert on tabela3
>> for each row execute *gerar_id()*;
>>
>> Etc...
>>
>> Em 9 de novembro de 2011 10:17, JotaComm <[email protected]> escreveu:
>>
>> Olá, Marllos
>>>
>>> Em 9 de novembro de 2011 10:15, Daniel Cristian Cruz <
>>> [email protected]> escreveu:
>>>
>>> Acredito que uma forma seja usando PL/Python:
>>>>
>>>> http://www.postgresql.org/docs/9.1/interactive/plpython-trigger.html
>>>>
>>>> Já procurei como fazer com PL/pgSQL, mas não encontrei como referenciar
>>>> dinamicamente o nome do atributo de chave primária.
>>>>
>>>> Você precisará consultar o catálogo, através da pg_attribute (attname)
>>>> e da pg_constraint (contype='p').
>>>>
>>>> Em 9 de novembro de 2011 10:02, Marllos <[email protected]>escreveu:
>>>>
>>>>>  Por favor, preciso de ajuda para revolver um problema. E se for
>>>>> possível gostaria de um exemplo.
>>>>>
>>>>> Em uma trigger, eu quero alterar a chave primária da tabela que
>>>>> dispara essa trigger, mas de forma dinâmica, por exemplo:
>>>>>
>>>>> new.(referencia dinâmica a chave primária da tebela) = valor.
>>>>>
>>>>
>>> Não entendi o que você deseja. Poderia colocar um exemplo prático da
>>> situação.
>>>
>>>>
>>>>> Obrigado.
>>>>>
>>>>> Marllos.
>>>>> _______________________________________________
>>>>> pgbr-geral mailing list
>>>>> [email protected]
>>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Daniel Cristian Cruz
>>>> クルズ クリスチアン ダニエル
>>>>
>>>> _______________________________________________
>>>> pgbr-geral mailing list
>>>> [email protected]
>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>
>>>>
>>>
>>> Abraços
>>> --
>>> JotaComm
>>> http://jotacomm.wordpress.com
>>>
>>> _______________________________________________
>>> 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
>>
>>
>
> Abraços
>
> --
> JotaComm
> http://jotacomm.wordpress.com
>
> _______________________________________________
> 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