Trigger für Begrenzung von Tabelleneinträgen

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/greg/index.php?/archives/89-Implementing-a-queue-in-SQL-Postgres-version.html

Andreas

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:

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();

Da die Überprüfung auf > 5 vor dem INSERT erfolgt, kannst Du so also max. 6 Spieler pro Mannschaft eingeben, dann kommt:

test=*# insert into kader values (1,7);
ERROR:  max. spieleranzahl erreicht
test=!#

Andreas

Nochmals danke für die promte Antwort.

Gruß
Sebastian