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
