Obrigado Volak, mas eu preciso mudar a chave primaria na funçao da trigger
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
