Re: Sequenz mit Ausnahmen

From: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Cc: "A(dot) Kretschmer" <andreas(dot)kretschmer(at)schollglas(dot)com>
Subject: Re: Sequenz mit Ausnahmen
Date: 2006-03-07 17:04:54
Message-ID: 20060307170453.GA18825@KanotixBox
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

A. Kretschmer <andreas(dot)kretschmer(at)schollglas(dot)com> schrieb:

> am 07.03.2006, um 16:26:03 +0100 mailte Daniel Seichter folgendes:
> > Hallo,
> >
> > welche Möglichkeiten habe ich, bei einer Sequenz, die von 1 bis
> > "unendlich" laufen soll, einen Wertebereich auszunehmen?!
> >
> > Die Werte 64000 bis 65000 sollen NICHT vergeben werden. Die Sequenz
> > zählt quasi eine Seriennummer hoch, die als Nummer auch in der
> > Fertigung verwendet wird.
>
> Schnellschuß:

schönere Version:

test=# create sequence seq_foo;
CREATE SEQUENCE
test=# create table foo (id int default nextval('seq_foo'));
CREATE TABLE
test=# \i foo_seq.sql
CREATE FUNCTION
test=#
test=# create trigger foo_trigger after insert on foo for each row execute procedure _foo_seq();
CREATE TRIGGER
test=#
test=#
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# insert into foo values (default);
INSERT 0 1
test=# select * from foo;
id
----
1
2
3
4
5
11
12
(7 rows)

Die Funktion in 'foo_seq.sql':
create or replace function _foo_seq() returns trigger as $$
begin
if currval('seq_foo') between 5 and 10 then
perform setval('seq_foo', 10);
end if;
return NULL;
end;
$$ language plpgsql;

Das ganze hat allerdings ein Problem:
Der Aufruf von currval() schlägt fehl, wenn in der aktuellen Session
vorher noch kein nextval() kam. Dies müßte noch abgefangen werden, hab
ich aber grad keinen rechten Plan für...

Ich *vermute* mal, man könnte ohne negativen Folgen¹ im Trigger auch
direkt auf das Feld last_value der Sequence zugreifen. Damit wäre das
Problem mit currval() und Session auch gelöst.

¹ im Sinne Transaktionssicherheit und so.

Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknow)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Andreas Kretschmer 2006-03-07 17:14:15 Re: Sequenz mit Ausnahmen
Previous Message A. Kretschmer 2006-03-07 16:07:53 Re: Sequenz mit Ausnahmen