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
