Olá,

Em 10 de novembro de 2011 11:38, Marllos <[email protected]>escreveu:

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

Então o código que enviei aqui ajuda bastante, ele não contém tudo, mas é o
caminho das pedras :)

>
>
> 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
>
>

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