Sequenz Trigger

Hallo zusammen,

ich hab folgendes Problem. Ich hab mich an einem Trigger versucht der den PK aus einer Sequenz zieht auch wenn man beim insert den PK mit angibt.
Folgendes hat auch funktioniert. (After Insert )
BEGIN
update hochschule set hochschule_id=nextval(‘hochschule_id_seq’) where hochschule_id=new.hochschule_id;

if not found then
RAISE EXCEPTION ‘Ein Fehler ist aufgetreten’;
End if;
RETURN NEW;

Jetzt meine Frage.
Funktioniert das auch ohne das ich ein Update in dem Trigger absetzen muss?
Den dieses Update löst einen anderen Trigger aus der ein Update auf den PK vehindert soll und ich somit gar keinen Wert mehr eintragen kann :confused:
Hab das versucht: new.hochschule_id:=nextval(‘sequenzname’)
Bin für jeden Tipp dankbar.

Gruß
Daniel

Hä?
Wenn Du in einer Table einen PK basierend auf einer Sequence hast, dann sollte man nur und ausschließlich diese Sequence nutzen. Du kannst für den PK im INSERT entweder default oder nextval(‘sequence’) angeben oder auch gleich bei der Spaltenaufzählung für den Insert die PK-Spalte weglassen. Einen extra Trigger brauchst Du da nicht.

Willst Du nach dem Insert den aktuellen PK wissen, dann verwende currval(). Ab 8.2 kannst Du außerdem noch mit RETURNING arbeiten.


Folgendes hat auch funktioniert. (After Insert )
[I]
[B]BEGIN
update hochschule set hochschule_id=nextval('hochschule_id_seq') where hochschule_id=new.hochschule_id;

if not found then
    RAISE EXCEPTION 'Ein Fehler ist aufgetreten';
End if;
RETURN NEW;[/B][/I]

Jetzt meine Frage.
Funktioniert das auch ohne das ich ein Update in dem Trigger absetzen muss?

Nein.

Ich versteh aber nun, was Du willst: Du willst ein insert into foo (id, bla) values (1, ‘so geht das nicht’) dahingehend verbiegen, daß daraus ein insert into foo (id, bla) values (default, ‘so is besser’) wird. Das könnte man evtl. über eine RULE handeln.

Hint: do instead


Andreas

Danke für den Tipp,

genau das war mein Problem. Bei Oracle funktoniert so eine Zuweisung nämlich. Dachte deshalb bei Postgres evtl auch.
So…dann schau ich mir mal rules an :wink:

Daniel