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

Responder a