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

Responder a