• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage zu Constraints/Trigger

CSSteff

Neues Mitglied
Hallo,
ich habe hier folgendes einfach DB-Schema:

Code:
Create Table Preistraeger(
  PNr Integer,
  Name varchar2(25),
  Land varchar2(15),
  
  Constraint pk_Preistraeger Primary Key(PNr)
);

Create Table Nobelpreis(
  Kategorie varchar2(15),
  Jahr Integer,
  PNr Integer,
  
  Constraint pk_Nobelspreis Primary Key(Kategorie, Jahr, PNr),
  
  Constraint fk_Nobelpreis Foreign Key(PNr)
    References Preistraeger(PNr)
);

Das Constraint ist, dass es pro Jahr und pro Kategorie max. drei Preisträger geben darf.
Wie überprüfe ich das?
Ich habs mit einem Trigger versucht, nur leider erhalte ich da eine Fehlermeldung:

Code:
CREATE OR REPLACE TRIGGER trig_anz_nobelpr
  BEFORE INSERT ON Nobelpreis
  FOR EACH ROW
    BEGIN
      IF(3 < (Select * From Nobelpreis n Where n.Jahr = :NEW.Jahr And n.Kategorie = :NEW.Kategorie And n.PNR <> :NEW.PNR)) THEN
        RAISE_APPLICATION_ERROR( -20001, 'Zu viele Nobelpreisträger!');
      END IF;
    END;
/
Ich erhalte folgenden Fehler:
Code:
Fehler(2,7): PL/SQL: Statement ignored
Fehler(2,14): PLS-00405: Unterabfrage ist in diesem Kontext nicht zulässig

Jemand eine Idee?!
Danke im Voraus!

L. G.
CSSteff

PS: Achja: Ich verwende Oracle-SQL. Die Lösung sollte möglichst einfach sein, da das eine Klausuraufgabe ist und eine geforderte, komplizierte Lösung sehr unwahrscheinlich ist.
 
Was willst Du genau prüfen? Also in welchem Moment? Der Trigger würde ja (wenn er denn funktionieren würde) greifen wenn ein neuer Datensatz in Nobelpreis eingefügt wird. Aber ist das auch inhaltlich richtig? Was sollte passieren oder zurückgegeben werden wenn es bereits 3 Datensätze gibt auf die das zutrifft?

Btw. ein alternativer Ansatz: MERGE INTO .. da kannst Du genauso eine Bedingung einfügen, hast nur eben keine Rückgabe vom Ergebnis davon.
 
Hi threadi,
danke, für deine Antwort.
Aufgrund alter Aufgabenstellungen bin ich mir ziemlich sicher, dass beim Einfügen geprüft werden soll.
MERGE INTO hatte wir nicht, deswegen kann er nicht darauf hinaus wollen. Die einzige Lösung wäre Trigger, aber es hapert an der Umsetzung.
Hast du eine Idee, wie ich das mit Trigger umsetzen kann?!

Danke im Voraus!
CSSteff
 
Zurück
Oben