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
