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

Responder a