instead of trigger "wie in oracle"

Moin,
ich bin neu hier und wollt erstmal loswerden wie glücklich ich bin ein pg Forum gefunden zu haben!

Ich hatte bis jetzt hauptsächlich mit Oracle zu tun und wollt nun privat lieber pg benutzen.

Bei oracle gibts die möglichkeit einen “Instead of Trigger” zu prgrammieren( pl/sql), das ist bei pg ja durch rules gelöst, allerdings gelingt es mir nicht, eine rule zu schreiben, die das tut was ich will.
Ich ahbe eine View, die zwei tabellen vereint.
tab 1:
name | laufendenummer

tab 2:
ort | laufendenummer_tab1

view:
laufendenummer | name | ort


ich möchte nun in die view etwas einfügen, und brauch dazu die neue laufendenummer von tab 1 (ist ein serial).
wie komm ich an die nummer?
mit NEW.laufendenummer gehts ja nicht…

Danke für eure hilfe!

Crypi

hi crypi,

hab das problem bisher nicht gehabt und rat jetzt einfach mal…

probier mal, eine sequenz zu erstellen und dann mit nextval(‘sequenz_name’) den wert zu nehmen. müsste bei oracle ja auch so sein (zumindest erinnere ich mich daran…).

cu tb.

so gehts!

jetzt stell ich mir nur die frage ob es dabei noch zu fehlern kommen kann, die wahrscheinlichkeit, dass jemand genau dann die sequenz hoch zählt während ich dabei bin meinen zweiten wert einzufügen ist ja sehr gering… oder wird das sowieso vom dbms vehindert?

würde mich interessieren wie ihr das macht oder ob es bei euch noch nie dazu kam, dass zwei voneinander abhängende werte gleichzeitig eingefügt werden, also 1:n beziehung.


anbei mein quellcode:

create sequence sequence1 start 1;

drop view adressen_komplett;
create or replace view adressen_komplett as
select a.laufendenummer,a.name,b.ort,c.ort as ortb
from stamm_kontakt a,stamm_adresse b,stamm_adresse c
where
a.laufendenummer=b.laufendenummer
AND
a.laufendenummer=c.laufendenummer;



CREATE or replace RULE test AS ON INSERT TO adressen_komplett DO INSTEAD
(insert into stamm_kontakt (laufendenummer,name)values(nextVal(‘sequence1’),NEW.name); insert into stamm_adresse (laufendenummer,ort)values(currVal(‘sequence1’),NEW.ort));

hi,

zitat aus dem handbuch:

This section describes PostgreSQL’s functions for operating on sequence objects. Sequence objects (also called sequence generators or just sequences) are special single-row tables created with CREATE SEQUENCE. A sequence object is usually used to generate unique identifiers for rows of a table. The sequence functions, listed in Table 9-34, provide simple, multiuser-safe methods for obtaining successive sequence values from sequence objects.

quelle: PostgreSQL: Documentation: 8.1: Sequence Manipulation Functions

sprich solange du das nicht per hand und setval änderst sollte es keine probleme geben :wink:

cu tb.

Hallo Crypi,

Die Frage hatte ich von einen Oracle-Spezialisten nicht erwartet. Aber die Antwort ist sehr einfach. Genau wie in Oracle, mittels einer Transaktion.


Weiter Infos: Das offizielle Handbuch (Deutsch) Kapitel 8.1.4, 3.4, … .



mfg

fristo

Moin,

das mit serial weiß ich, war nur ein test obs generell funktioniert, deswegen die neue sequenz.

“Oracle-Spezialist”… wenn ich das geschrieben habe bin ein Lügner… Wenn das so rüberkam hab ichs falsch ausgedrückt.

Klar gehts mit Transaktionen, bloß meine bisherige Lösung gefiel mir so gar nicht…war doch etwas umständlich…

Macht ihr das jetzt so ähnlich wie meine Lösung?

Crypi

Hallo Crypi,

Das ‘Moin’ hört sich nach Norddeutschland an. Da gibt es aber auch Gebiete wo man ‘moin, moin’ sagt.


Den “Oracle-Spezialist” habe ich definiert, ein Lügner bist Du schon garnicht und Du hast Dich auch nicht falsch ausgedrückt. Ich wollte Dir auch nichts unterstellen. Du kennst vielleicht auch schon das: In den Firmen gibt es immer 2 Fraktionen, da sind die UNIX Freaks und die Windows Freaks, das gleiche ist bei den Datenbanken , die einen arbeiten mit Oracle und … unter Unix, die anderen arbeiten mit Datenbanken unter Windows. Ich bin in beiden Lagern zuhause und habe damit auch keine Probleme. Was bei mir hängen geblieben ist, sind so einige (-) Erfahrungen mit Oracle-Spezialisten, die abgehoben hatten. Dieses wollte ich Dir aber nicht andichten. Also, bleib so wie Du bist.


Mir fällt im Augenblick keine bessere Lösung ein und mit einer Transaktion bist Du auf der ganz sicheren Seite.



mfg

fristo

“moin moin” sagt man nicht!!!

“moin” ist das einzig wahre!! :wink: und das kann man, entgegen der weitläufigen Meinung, zu jeder Tages oder Nachtzeit benutzen… also nicht nur Morgens!! Ist ein all-round Begriff der im grunde immer passt!

Komme aus Hamburg.

diese spezialo-typen kenn ich auch aber eher im bereich betriebssysteme…da dann aber auch ganz hart… mit datenbanken ist mir das noch nicht so unter gekommen. (allerdings hab ich auch noch nicht so die erfahrung…)

Crypi