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

Responder a