Boa tarde, dei uma pesquisada na lista e não achei algo a respeito, por isso
resolvi postar aqui.
Tenho algumas tabelas as quais não queria usar o campo do Tipo Serial, por
causa do buraco que eles provocam quando se trabalha com transações (que não
foram commitadas), tentei implementar a geração do código via Trigger/Função em
PLPGSQL da seguinte forma:
Função:
CREATE OR REPLACE FUNCTION cli_gatilho() RETURNS "trigger" AS$BODY$DECLARE
V_CODIGO CLIENTES.CODIGO%TYPE;BEGIN -- SE O NOME FOR VAZIO IF NEW.NOME IS NULL
THEN RAISE EXCEPTION 'O NOME DO CLIENTE NAO PODE SER NULO'; END IF; -- SE A
DENOMINACAO FOR VAZIA IF NEW.DENOMINACAO IS NULL THEN RAISE EXCEPTION 'A
DENOMINACAO NÃO PODE SER NULA'; END IF; -- SELECIONAR ULTIMO CODIGO SELECT INTO
V_CODIGO MAX(CLIENTES.CODIGO) FROM CLIENTES; NEW.CODIGO:=V_CODIGO +1;
NEW.DTCADASTRO := 'NOW'; NEW.ATIVO:=TRUE; RETURN NEW;
END;$BODY$ LANGUAGE 'plpgsql' VOLATILE;ALTER FUNCTION cli_gatilho() OWNER TO
indexpost;
Gatilho:
CREATE TRIGGER cli_gatilho BEFORE INSERT ON clientes FOR EACH ROW EXECUTE
PROCEDURE cli_gatilho();
Vamos supor que duas transações foram startadas em processos diferentes e que a
tabela possui um único registro, cujo o valor do campo código é 1. O que
acontece com esse gatilho é o seguinte:
Quando abrimos a primeira transação, chamamos o método insert, preenchemos os
dados e chamamos o método post, ainda com a transação aberta o valor 2 é
atribuído ao campo codigo. Dái abrimos a segunda transação, chamamos o método
insert, preenchemos os dados, chamamos o método post, o que aconteçe?
Bom a segunda transação faz o computador ficar esperando a primeira finalizar,
se o resultado da primeira transação for Rollback, a segunda transação volta a
responder e o valor 2 é atribuído ao campo código; se o resultado da primeira
transação for commit, a segunda transação retornará um erro dizendo (e com
razão) que o índice unique não pode ter valores duplicados.
Gostaria de saber se alguem sabe como implementar campo de autonumeração que
não seja o próprio tipo serial do PostgreSQL e que com o uso de transações não
deixe tais (buracos) e que respeitem os critérios de unicidade?
Ou ainda qual seria outra sugestão para implementar em uma situação destas...
Grato desde já pela atenção dispensada a esta demanda,
Atenciosamente,
ADENILTON Batista da Silva Index Informática LTDA (79)3431-3234 /
9142-0886 [EMAIL PROTECTED]
_________________________________________________________________
Instale a Barra de Ferramentas com Desktop Search e ganhe EMOTICONS para o
Messenger! É GRÁTIS!
http://www.msn.com.br/emoticonpack
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral