Rogério A Bassete escreveu:
> Primeiramente, peço desculpas por invadir a sua caixa postal, encontrei
> seu email em www.postgresql.org.br, por isso estou lhe enviando este
> email. Se você puder doar um pouco do seu precioso tempo para me ajudar,
> fico grato.
>
Sem problemas. Só não espere uma resposta imediata. Às vezes, estou
muito atarefado e não tenho tempo de responder e-mails. :) Você poderia
assinar a nossa lista de discussão, pois assim você pode ter uma
resposta mais *rápida* [1].
> Qual a maneira correta de se obter um sequência continua e sem falhas
> para uma chave composta, ex:
>
> CREATE TABLE nf
> (
> numero INTERGER NOT NULL,
> serie VARCHAR(2) NOT NULL,
> CONSTRAINT pky_nf PRIMARY KEY (numero,serie)
> )
>
> numero serie
> 1 A
> 2 A
> 1 B
> 3 A
> 4 A
> 2 B
>
Como seria a lógica desta chave composta? Existem somente as séries A e
B e o que varia é o número? Se for isto, basta fazer usar uma função
assim:
CREATE OR REPLACE FUNCTION foo(b varchar) RETURNS VOID as
$$
DECLARE
x RECORD;
y INTEGER;
BEGIN
SELECT INTO x MAX(numero) AS n FROM nf WHERE serie = b;
IF x.n IS NULL THEN
x.n := 0;
END IF;
y := x.n + 1;
INSERT INTO nf (numero, serie) VALUES(y, b);
IF FOUND THEN
RAISE NOTICE 'registro inserido: (%, %)', y, b;
END IF;
RETURN;
END;
$$
language 'plpgsql';
> Pelo meus conhecimentos, necessito usar LOCK TABLE ou SELECT FOR UPDATE,
> mas em ambos os casos se o terminal do cliente for interrompido
> bruscamente o registro/tabela fica travado no servidor por tempo
> indeterminado.
>
Qual a versão do PostgreSQL você está utilizando? 8.0? S.O. Window$? O
LOCK e SELECT ... FOR UPDATE é utilizado para realizar bloqueios em
tabelas. Acho que isso foi corrigido em versões futuras (8.2).
> Você conhece alguma configuração no PostgreSQL ou no Linux para liberar
> *lock implícito* de um objeto do PostgreSQL caso a conexão do cliente
> seja interrompida bruscamente (reset, queda de força, etc).
>
Não existe configuração. Você vai ter que fazer isso manualmente com a
função pg_cancel_backend() [2].
[1] http://lists.pgfoundry.org/mailman/listinfo/brasil-usuarios
[2]
http://www.postgresql.org/docs/8.2/static/functions-admin.html#FUNCTIONS-ADMIN-SIGNAL-TABLE
PS> estou enviando este e-mail para lista pois pode ser útil para outra
pessoa.
--
Euler Taveira de Oliveira
http://www.timbira.com/
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/
Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios