Obrigado Volak, mas eu preciso mudar a chave primaria na funçao da trigger

Em 9 de novembro de 2011 11:52, Wolak <[email protected]> escreveu:

>  Em 09/11/2011 11:17, Marllos 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;
>
> 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 
> [email protected]https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
>
>
> __________ Information from ESET NOD32 Antivirus, version of virus signature 
> database 6615 (20111109) __________
>
> The message was checked by ESET NOD32 Antivirus.
> http://www.eset.com
>
>
> eu fiz isso de outra maneira, veja se é isso que precisa, isso é um
> exemplo que fiz para um colega que usava Firebird.
>
> --postgresql.conf
> --custom_variable_classes = 'sistema'        # list of custom variable
> class names
> --sistema.fkempresa = 0
> --sistema.fkfilial = 0
> --SELECT SET_CONFIG('sistema.fkempresa', '1', FALSE); -- FALSE para sessão
> atual, TRUE para transação atual
> --SELECT SET_CONFIG('sistema.fkfilial', '2', FALSE);
>
> CREATE OR REPLACE FUNCTION codigonovo(pnometabela VARCHAR,ptipo VARCHAR)
> RETURNS VARCHAR AS
> $$
> DECLARE
>     nFkempresa INTEGER;
>     nFkfilial  INTEGER;
>    rRetorno   RECORD;
> BEGIN
>     SELECT INTO nFkempresa CURRENT_SETTING('sistema.fkempresa');
>     SELECT INTO nFkfilial CURRENT_SETTING('sistema.fkfilial');
>     IF COALESCE(nFkempresa,0) = 0 THEN
>         RAISE EXCEPTION 'Empresa não setada para a sessão corrente!';
>     END IF;
>     IF COALESCE(nFkfilial,0) = 0 THEN
>         RAISE EXCEPTION 'Filial não setada para a sessão corrente!';
>     END IF;
>     IF LOWER(pTipo) = 'empresa' THEN
>         RETURN nFkempresa;
>     END IF;
>     IF LOWER(pTipo) = 'filial' THEN
>         RETURN nFkfilial;
>     END IF;
>    FOR rRetorno IN EXECUTE 'SELECT COALESCE(MAX(sequencia),0) + 1 AS
> sequencia
>                             FROM '||pnometabela||'
>                             WHERE fkempresa = '||nFkempresa||'
>                             AND fkfilial = '||nFkfilial
>    LOOP
>        IF LOWER(pTipo) = 'sequencia' THEN
>            RETURN rRetorno.sequencia;
>        ELSE
>            RETURN nFkempresa||'.'||nFkfilial||'.'||rRetorno.sequencia;
>        END IF;
>    END LOOP;
> END;
> $$
> LANGUAGE plpgsql;
>
> CREATE TABLE cadastro
> (
>   fkempresa integer DEFAULT codigonovo('cadastro'::character
> varying,'empresa'::character varying)::INTEGER,
>   fkfilial integer DEFAULT codigonovo('cadastro'::character
> varying,'filial'::character varying)::INTEGER,
>   sequencia integer DEFAULT codigonovo('cadastro'::character
> varying,'sequencia'::character varying)::INTEGER,
>   codigo character varying DEFAULT codigonovo('cadastro'::character
> varying,'codigo'::character varying),
>   descricao character varying(100)
> )
> WITH (
>   OIDS=FALSE
> );
> ALTER TABLE cadastro OWNER TO postgres;
>
> SELECT SET_CONFIG('sistema.fkempresa', '1', FALSE); -- FALSE para sessão
> atual, TRUE para transação atual
> SELECT SET_CONFIG('sistema.fkfilial', '2', FALSE);
> INSERT INTO cadastro (descricao) VALUES ('teste');
> SELECT * FROM cadastro ORDER BY sequencia DESC;
>
>
> _______________________________________________
> 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