Funktion über mehrere Tabellen

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
quder
Neuer Benutzer
Beiträge: 1
Registriert: Do 22. Feb 2018, 17:07

Funktion über mehrere Tabellen

Beitrag von quder » Do 22. Feb 2018, 17:16

Hallo zusammen

Ich bin neu hier und noch ziemlich am Anfang was PostgreSQL betrifft. Aber vielleicht könnt ihr mir weiterhelfen.
Ich muss einen Trigger mit "BEFORE INSERT ON buchungen" erstellen, welcher die folgende Funktion auslöst:
Die Funktion muss überprüfen viele Buchungen laufen auf eine Flugnummer, zählt die Anzahl_Personen zusammen und subtrahiert diese an den Sitzplätze des jeweiligen Fliegers. Damit findet die Funktion heraus wie viel Platz der Flieger noch hat.
Hat mir da jemand einen Tipp


create table kunden
(
kunden_id serial primary key,
vorname varchar(50),
name varchar(50) NOT NULL,
adresse varchar(50) NOT NULL,
ort varchar(50) NOT NULL
);

create table reisebuero
(
reisebuero_id serial primary key,
adresse varchar(50) NOT NULL,
ort varchar(50) NOT NULL
);

create table buchungen
(
buchungen_id serial primary key,
anzahl_personen int NOT NULL,
kunden_id_fk int,
flugplan_id_fk int,
reisebuero_id_fk int
);

create table flugzeuge
(
flugzeuge_id serial primary key,
hersteller varchar(50) NOT NULL,
typ varchar(50) NOT NULL,
sitzplaetze int NOT NULL,
fluggesellschaften_id_fk int
);

create table fluggesellschaften
(
fluggesellschaften_id serial primary key,
name varchar(50) NOT NULL
);

create table destinationen
(
destinationen_id serial primary key,
flughafen varchar(50) NOT NULL
);

create table flugplan
(
flugplan_id serial primary key,
flugnummer varchar(50) NOT NULL,
abflugsdatum date NOT NULL,
ankunftsdatum date NOT NULL,
abflugdestination varchar(50) NOT NULL,
zieldestination varchar(50) NOT NULL,
freie_sitzplaetze int,
flugzeuge_id_fk int
);



alter table buchungen
add constraint reisebuero_id_fk foreign key (reisebuero_id_fk)
references reisebuero (reisebuero_id) on update cascade on delete cascade;

alter table buchungen
add constraint kunden_id_fk foreign key (kunden_id_fk)
references kunden (kunden_id) on update cascade on delete cascade;

alter table buchungen
add constraint flugplan_id_fk foreign key (flugplan_id_fk)
references flugplan (flugplan_id) on update cascade on delete cascade;

alter table flugzeuge
add constraint fluggesellschaften_id_fk foreign key (fluggesellschaften_id_fk)
references fluggesellschaften (fluggesellschaften_id) on update cascade on delete cascade;

alter table flugplan
add constraint flugzeuge_id_fk foreign key (flugzeuge_id_fk)
references flugzeuge (flugzeuge_id) on update cascade on delete cascade;

akretschmer
Erfahrener Benutzer
Beiträge: 7458
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Funktion über mehrere Tabellen

Beitrag von akretschmer » Do 22. Feb 2018, 17:26

Was ist denn Dein Ansatz?

Bekommst das nötige Select selber hin? Im TRIGGER kannst Du auf NEW.* zugreifen

sum(anzahl) from buchungen where flugplan_id_fk = new.flugplan_id_fk

Spannend wird es, wenn viele gleichzeitig das machen...
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

pogomips
Benutzer
Beiträge: 58
Registriert: Fr 18. Nov 2016, 09:55

Re: Funktion über mehrere Tabellen

Beitrag von pogomips » Do 22. Feb 2018, 21:48

Geht es um eine echte Anwendung?
Ich bin jetzt kein Vielflieger, aber eine Flugbuchung basiert m.E. nicht auf Anzahl von Sitzplätzen, sondern auf einem konkreten Sitzplatz. Die Zählerei kann man natürlich machen, aber es sieht mir nicht so aus, als ob es einen realen Nutzen hat.
Und dann wäre die Frage, was macht man in dem Moment, wenn der Before(!) Insert Trigger feststellt, das passt nicht?
Wird überbucht? Wird abgebrochen? Hängt das u.U. von einer erfolgten Zahlung ab? Oder kommt die Zahlung anschließend? ..?

Wie akretschmer schon sagt, es wird spannend wenn..
Solche Buchungssysteme sind idR. nicht klein. Kann natürlich sein, dass das System nur für einen Zeppelinrundflug über Koblenz gedacht ist, aber..
Ein echter Fluggast will am Webbrowser ggF. nicht warten, bis alle einmal aufgestanden sind und durchgezählt wurde. Im Gegensatz zu vielen anderen Anwendungsfällen ist der Verkauf von (echter) Ware ein stark konkurrierendes Verfahren. Es wird solange verkauft, bis nichts mehr da ist (und den letzten beißen die Hunde). Das kann schon mal eng werden.
Hier sind tatsächlich genaue Verfahrensüberlegungen/-vorgaben wichtig, um nicht von Anfang an Schrott zu produzieren.

Antworten