Foi mal amigo....
Na verdade eu quero é atribuir um valor a chave primária, mas fazendo
refencia dinamica a chave.


No Firebird, eu sou obrigado a ter uma função de trigger para cada tabela

Em 10 de novembro de 2011 08:21, JotaComm <[email protected]> escreveu:

> Olá,
>
> Em 9 de novembro de 2011 18:44, Marllos <[email protected]>escreveu:
>
> Obrigado Volak, mas eu preciso mudar a chave primaria na funçao da trigger
>>
>
> O que você considera mudar a chave primaria? Executar um ALTER TABLE na
> coluna que tem a chave primária? Mudar o valor do atributo da chave
> primária?
>
> Meu exemplo foi para dar uma idéia do que você pode fazer, não conclui o
> exemplo porque de fato não consegui entender o que de fato você deseja.
>
>>
>> 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
>>
>>
>
> 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