Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Frage zu Constraints/Trigger

Dieses Thema im Forum "Oracle" wurde erstellt von Steffo, 29 Juni 2013.

  1. Steffo

    Steffo Benutzer

    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.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Hat das nun einklich geholfen?
     
  4. Steffo

    Steffo Benutzer

    Noch nicht. Müsste aber funktionieren, danke! :)

    L. G.
    Steffo
     
  5. Steffo

    Steffo Benutzer

    Übrigens: Ohne Trigger funktioniert das aber nicht, oder?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ich sehe keinen TRIGGER.
     
  7. Steffo

    Steffo Benutzer

    Irgendwie muss bewerkstelligt werden, dass i in slave inkrementiert wird, wenn ein Datensatz in Nobelpreis hinzugefügt wird.
     
  8. akretschmer

    akretschmer Datenbank-Guru


    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.
     
  9. Steffo

    Steffo Benutzer

    Ne, ich werd das wohl mit Triggern lösen müssen, die in Oracle SQL funktionieren. ;)
    Danke!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden