Mit anderen Worten: die table darf nur maximal N Einträge haben. Der pure Zufall will, daß ich dafür einen passenden Link habe:
http://people.planetpostgresql.org/g...s-version.html
Andreas
Hallo zusammen,
als Neuling in diesem Forum und beim Thema Trigger habe ich fogendes Problem:
Für den Trigger habe ich folgende Tabellen erstellt:
CREATE TABLE Mannschaft
(
ID_Mannschaft int NOT NULL,
FK_ID_Trainer int NOT NULL,
Mannschaftsname varchar(40) NOT NULL,
CONSTRAINT Mannschaft_pkey PRIMARY KEY (ID_Mannschaft),
CONSTRAINT Mannschaft_FK_ID_Trainer_fkey FOREIGN KEY (FK_ID_Trainer)
REFERENCES Trainer (FK_ID_Trainer) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT
)
CREATE TABLE Spieler
(
FK_ID_Spieler int NOT NULL,
Spielername varchar(40) NOT NULL,
CONSTRAINT Spieler_pkey PRIMARY KEY (FK_ID_Spieler),
CONSTRAINT Spieler_FK_ID_Spieler_fkey FOREIGN KEY (FK_ID_Spieler)
REFERENCES Mitglieder (FK_ID_Mitglied) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
CREATE TABLE Kader
(
FK_ID_Mannschaft int NOT NULL,
FK_ID_Spieler int NOT NULL,
CONSTRAINT Kader_pkey PRIMARY KEY (FK_ID_Mannschaft, FK_ID_Spieler),
CONSTRAINT Kader_FK_ID_Mannschaft_fkey FOREIGN KEY (FK_ID_Mannschaft)
REFERENCES Mannschaft (ID_Mannschaft) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT Kader_FK_ID_Spieler_fkey FOREIGN KEY (FK_ID_Spieler)
REFERENCES Spieler (FK_ID_Spieler) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
Soweit so gut, nun will ich aber die maximale Anzahl von Spielern in einer Mannschaft begrenzen, bspw. auf 8 Spieler je Mannschaft. Ich wollte dies mit einem Trigger lösen, doch leider weiß ich nicht genau wie:
CREATE TRIGGER `trigger01`
BEFORE INSERT
ON `kader`
FOR EACH ROW/STATEMENT
BEGIN
?? Abfrage wieviele Spieler bisher in der Mannschaft sind, wenn weniger als zulässiges Maximum je Mannschaft, dann füge Datensatz hinzu, ansonsten breche den Insert-Vorgang ab
END;
Bei den verbalen Ausführungen brächte ich eure Hilfe. Vorab schon mal herzlichen Dank.
Gruß
Sebastian
Mit anderen Worten: die table darf nur maximal N Einträge haben. Der pure Zufall will, daß ich dafür einen passenden Link habe:
http://people.planetpostgresql.org/g...s-version.html
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Hallo Andreas,
danke für den Link, doch wird darin ein recht hartes Vorgehen beschrieben, da man nach dem FIFO-Prinzip Daten einfach löscht - das will ich nicht.
In meiner Tabelle Kader können maximal Anzahl von Mannschaften * max. Spieler pro Mannschaft Einträge sein.
Gruß
Sebastian
Okay, schreib einen before-trigger, der in NEW nach der ID für die Mannschaft schaut und dann ermittelt, wie viele schon drin sind. Ich hab das mal gemacht, folgendes sollte in etwa dann das machen, was du willst. Du mußt nur die Obergrenze anpassen:
Da die Überprüfung auf > 5 vor dem INSERT erfolgt, kannst Du so also max. 6 Spieler pro Mannschaft eingeben, dann kommt:Code:create or replace function max_spieler() returns trigger as $$ declare anzahl int; begin select into anzahl count(1) from kader where mannschaft = NEW.mannschaft; if anzahl > 5 then raise exception 'max. spieleranzahl erreicht'; end if; return NEW; end; $$ language plpgsql; create trigger max_spieler before insert on kader for each row execute procedure max_spieler();
Code:test=*# insert into kader values (1,7); ERROR: max. spieleranzahl erreicht test=!#
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Nochmals danke für die promte Antwort.
Gruß
Sebastian
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen