Frage zu Constraints/Trigger

Steffo

Benutzer
Beiträge
7
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 General 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 Count(*) From Nobelpreis n Where n.Jahr = :NEW.Jahr And n.Kategorie = :NEW.Kategorie )) 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.
Steffo

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.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.736

Ich könnte mir sowas vorstellen, jetzt aber nicht vollständig geprüft:

Code:
test=# create table master (id int primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
CREATE TABLE
Time: 4,074 ms
test=*# create table slave (id int references master, i int, primary key (id, i),  check (i between 1 and 3));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "slave_pkey" for table "slave"
CREATE TABLE
Time: 5,937 ms

Durch den primary key auf (id,i) und der CHECK-Condition darf es pro ID nur 3 geben, das ist, was Du willst.
 

Steffo

Benutzer
Beiträge
7
Irgendwie muss bewerkstelligt werden, dass i in slave inkrementiert wird, wenn ein Datensatz in Nobelpreis hinzugefügt wird.
 

akretschmer

Datenbank-Guru
Beiträge
9.736
Irgendwie muss bewerkstelligt werden, dass i in slave inkrementiert wird, wenn ein Datensatz in Nobelpreis hinzugefügt wird.


Da hab ich jetzt keine elegante Lösung, sorry. Oder vielleicht doch ;-)

Code:
test=# create table bla (id int, val text);
CREATE TABLE
test=*# with tmp_bla as (select coalesce(max(id),0) as x from bla) insert into bla select tmp_bla.x+1, 'erster' from tmp_bla;
INSERT 0 1
test=*# with tmp_bla as (select coalesce(max(id),0) as x from bla) insert into bla select tmp_bla.x+1, 'zweiter' from tmp_bla;
INSERT 0 1
test=*# with tmp_bla as (select coalesce(max(id),0) as x from bla) insert into bla select tmp_bla.x+1, 'dritter' from tmp_bla;
INSERT 0 1
test=*# select * from bla;
id |  val
----+---------
  1 | erster
  2 | zweiter
  3 | dritter
(3 rows)


Ich weiß aber nicht, ob Oraggle das kann. Nennt sich "writeable Common Table Expressions" und das kann möglicherweise derzeit nur PostgreSQL.

Eine Sequence geht ja leider nicht, da Du ja für jedes Jahr separat zählen willst.
 
Werbung:
Oben