1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Trigger

Discussion in 'Office-Programme' started by Ohmariusz, Jun 11, 2008.

Thread Status:
Not open for further replies.
  1. Ohmariusz

    Ohmariusz ROM

    Guten Tag!

    Ich habe eine kleine Aufgabe und muss diese möglichst innovativ, aber auch richtig lösen. Es geht um einfache Trigger.

    Code:
    DROP TABLE Videothek_Hat_ausgeliehen;
    DROP TABLE Videothek_Medium;
    DROP TABLE Videothek_Person;
    DROP TABLE Videothek_Einrichtung;
    
    CREATE TABLE Videothek_Einrichtung (
      name varchar(50) not null,
      anzahl_ausgeliehener_medien number default 0 not null,
      typ varchar(50) not null,
      CONSTRAINT pk_videothek_einrichtung PRIMARY KEY ( name ),
      CONSTRAINT max_anzahl_einrichtung CHECK ( ( ( typ = 'Schule' ) AND ( anzahl_ausgeliehener_medien <= 100 ) ) OR ( anzahl_ausgeliehener_medien <= 30 ) )
    );
    
    CREATE TABLE Videothek_Person (
      name varchar(50) not null,
      anzahl_ausgeliehener_medien number default 0 not null,
      name_einrichtung varchar(50) REFERENCES Videothek_Einrichtung,
      CONSTRAINT pk_videothek_person PRIMARY KEY ( name ),
      CONSTRAINT max_anzahl_person CHECK ( anzahl_ausgeliehener_medien <= 5 )
    );
    
    CREATE TABLE Videothek_Medium (
      id number not null CONSTRAINT pk_medium PRIMARY KEY,
      hersteller varchar(50) not null,
      titel varchar(50) not null,
      typ varchar(10) not null,
      name_person varchar(50) REFERENCES Videothek_Person,
      name_einrichtung varchar(50) REFERENCES Videothek_Einrichtung,
      CONSTRAINT chk_typ CHECK ( typ IN ( 'DVD','VHS','CD' ) ),
      CONSTRAINT chk_gleichzeitig_ausliehen CHECK (name_person IS NULL OR name_einrichtung IS NULL)
    );
    
    CREATE TABLE Videothek_hat_ausgeliehen (
      id_medium number not null REFERENCES Videothek_Medium,
      name_person varchar(50) not null REFERENCES Videothek_Person,
      datum date default sysdate not null,
      rueckgabedatum date,
      CONSTRAINT pk_videothek_hat_ausgeliehen PRIMARY KEY ( id_medium, name_person, datum )
    );
    
    
    -- Falls Sie fuer Ihre Ausleih-Historie eine eigene ID benutzen:
    -- Die Sequence bitte unveraendert einlaufen lassen!!!
    CREATE SEQUENCE Videothek_History_Sequenz INCREMENT BY 1;
    
    
    -- Der folgende Trigger verwaltet die Ausleih-Historie von Personen.
    -- Diesen Trigger muessen Sie noch an Ihre Tabellen-Struktur anpassen!!!
    -- Also im Trigger Tabellen- und Spalten-Namen so aendern, dass er
    -- zu Ihren Tabellen passt!
    -----------------------------------------------------------------------
    -- Der Trigger reagiert auf Aenderungen in der Tabelle Videothek_Medium.
    -- Der Trigger ist als AFTER ROW Trigger konzipiert, um sicherzustellen,
    -- dass das bei einem INSERT gerade anzulegende Medium tatsaechlich
    -- existiert, damit die Ausleih-Historie darauf referenzieren kann.
    
    CREATE OR REPLACE TRIGGER manage_History
    AFTER INSERT                           -- nach INSERT
    OR    UPDATE of name_person -- oder UPDATE der Spalte, die die Person referenziert
    ON    Videothek_Medium                 -- in der Tabelle Videothek_Medium
    FOR   EACH ROW
    -- DECLARE                                -- diese beiden Zeilen benoetigen Sie nur, falls Sie
    --   hist_id integer;                     -- fuer Ihre Ausleih-Historie eine eigene ID benutzen
    BEGIN
      -- Um den Trigger nicht zu kompliziert zu machen, gehen wir davon aus,
      -- dass ein Medium immer erst an die Videothek zurueckgegeben werden muss,
      -- bevor es wieder verliehen werden kann.
    
      -- Der folgende Fall beschreibt, dass das Medium gerade an eine Person verliehen wird:
      -- (All jene, die "nicht verliehen" anders als durch NULL kennzeichnen,
      --  muessen die Bedingung entsprechend aendern!)
      IF	:old.name_person IS NULL
      AND	:new.name_person IS NOT NULL
      THEN
        -- Die folgende Zeile benoetigen Sie nur, falls Sie
        -- fuer Ihre Ausleih-Historie eine eigene ID benutzen:
        -- SELECT Videothek_History_Sequenz.nextval INTO hist_id FROM dual;
        -- INSERT des entsprechenden Eintrages in der Ausleih-Historie:
        INSERT INTO Videothek_hat_ausgeliehen
                    ( -- Historien_ID,  -- dieses Feld nur bei Benutzung einer eigenen ID
                      datum, -- dieses Feld nur bei Benutzung eines Ausleih-Datums
                      name_person,
                      id_medium )
        VALUES      ( -- hist_id,       -- diesen Wert nur bei Benutzung einer eigenen ID
                      sysdate,       -- diesen Wert nur bei Benutzung eines Ausleih-Datums
                      :new.name_person,
                      :new.id);
      END IF;
    
      -- Der folgende Fall beschreibt, dass das Medium gerade von einer Person zurueckgegeben wird:
      -- (All jene, die "nicht verliehen" anders als durch NULL kennzeichnen,
      --  muessen die Bedingung entsprechend aendern!)
      IF	:old.name_person IS NOT NULL
      AND	:new.name_person IS NULL
      THEN
        -- Diesen gesamten Fall benoetigen Sie nur, falls Sie
        -- in Ihrer Ausleih-Historie eine Rueckgabe-Datum benutzen!!!
        -- UPDATE des entsprechenden Eintrages in der Ausleih-Historie:
        UPDATE Videothek_hat_ausgeliehen
        SET    rueckgabedatum = sysdate
        WHERE  name_person     = :old.name_person
        AND    id_medium       = :old.id
        AND    rueckgabedatum IS NULL;
      END IF;
    
    END;
    /
    
    INSERT INTO VIDEOTHEK_PERSON ( NAME, NAME_EINRICHTUNG )
    VALUES ( 'Franz', '' );
    INSERT INTO VIDEOTHEK_PERSON ( NAME, NAME_EINRICHTUNG )
    VALUES ( 'Ferdinand', '' );
    INSERT INTO VIDEOTHEK_EINRICHTUNG ( NAME, TYP )
    VALUES ( 'Waldorf Schule', 'Schule' );
    INSERT INTO VIDEOTHEK_MEDIUM 
    VALUES ( 1, 'Cinemaxx', 'Matrix', 'DVD', 'Franz', '' );
    INSERT INTO VIDEOTHEK_MEDIUM 
    VALUES ( 2, 'Kleopatra', 'Herr der Ringe', 'VHS', 'Franz', '' );
    INSERT INTO VIDEOTHEK_MEDIUM 
    VALUES ( 3, 'Kleopatra', 'Bugs Bunny', 'CD', 'Franz', '' );
    INSERT INTO VIDEOTHEK_MEDIUM 
    VALUES ( 4, 'Cinemaxx', 'Zack', 'CD', 'Franz', '' );
    INSERT INTO VIDEOTHEK_MEDIUM 
    VALUES ( 5, 'Cinemaxx', 'Donald Duck', 'DVD', 'Franz', '' );
    INSERT INTO VIDEOTHEK_MEDIUM 
    VALUES ( 6, 'Ceasar', 'Bambi', 'VHS', '', '' );
    UPDATE VIDEOTHEK_PERSON SET name_einrichtung = 'Waldorf Schule' WHERE NAME = 'Ferdinand';
    
    SELECT * FROM VIDEOTHEK_HAT_AUSGELIEHEN;
    SELECT * FROM VIDEOTHEK_MEDIUM;
    UPDATE VIDEOTHEK_MEDIUM SET NAME_PERSON = 'Ferdinand' WHERE ID = 6;
    SELECT * FROM VIDEOTHEK_MEDIUM;
    SELECT * FROM VIDEOTHEK_HAT_AUSGELIEHEN;
    UPDATE VIDEOTHEK_MEDIUM SET NAME_PERSON = NULL WHERE ID = 6;
    SELECT * FROM VIDEOTHEK_MEDIUM;
    SELECT * FROM VIDEOTHEK_HAT_AUSGELIEHEN;
    
    -- Nach dem fehlerfreien Einlaufen des angepassten Triggers manage_History
    -- sollen zwei weitere Trigger zur Verwaltung der Zaehler entwickelt werden:
    -- ein Trigger fuer den Zaehler in der Personen-Tabelle und
    -- ein Trigger fuer den Zaehler in der Einrichtungen-Tabelle
    -----------------------------------------------------------------------
    -- Beide Trigger reagieren auf Aenderungen in der Tabelle Videothek_Medium.
    -- Beide Trigger sind als BEFORE ROW Trigger konzipiert.
    
    
    CREATE TRIGGER manage_Person_Counter
    BEFORE INSERT                           -- vor  INSERT
    OR     DELETE                           -- oder DELETE
    OR     UPDATE of ausgeliehen_von_Person -- oder UPDATE der Spalte, die die Person referenziert
    ON     Videothek_Medium                 -- in der Tabelle Videothek_Medium
    FOR    EACH ROW
    BEGIN
      -- Um den Trigger nicht zu kompliziert zu machen, gehen wir davon aus,
      -- dass ein Medium immer erst an die Videothek zurueckgegeben werden muss,
      -- bevor es wieder verliehen werden kann.
    
      -- Implementieren Sie hier nach dem Beispiel-Trigger manage_History folgende Faelle:
    
      -- Der folgende Fall beschreibt, dass das Medium gerade an eine Person verliehen wird:
      null; -- Bitte ersetzen!!!
    
      -- Der folgende Fall beschreibt, dass das Medium gerade von einer Person zurueckgegeben wird:
      null; -- Bitte ersetzen!!!
    
    END;
    /
    
    CREATE TRIGGER manage_Einr_Counter
    BEFORE INSERT                           -- vor  INSERT
    OR     DELETE                           -- oder DELETE
    OR     UPDATE of ausgeliehen_von_Einr   -- oder UPDATE der Spalte, die die Einrichtung referenziert
    ON     Videothek_Medium                 -- in der Tabelle Videothek_Medium
    FOR    EACH ROW
    BEGIN
      -- Um den Trigger nicht zu kompliziert zu machen, gehen wir davon aus,
      -- dass ein Medium immer erst an die Videothek zurueckgegeben werden muss,
      -- bevor es wieder verliehen werden kann.
    
      -- Implementieren Sie hier nach dem Beispiel-Trigger manage_History folgende Faelle:
    
      -- Der folgende Fall beschreibt, dass das Medium gerade an eine Einrichtung verliehen wird:
      null; -- Bitte ersetzen!!!
    
      -- Der folgende Fall beschreibt, dass das Medium gerade von einer Einrichtung zurueckgegeben wird:
      null; -- Bitte ersetzen!!!
    
    END;
    /
    
    Ich brauche Hilfe, ob der Trigger, der bereits geschrieben wurde richtig/innovativ ist, und wie man die weiteren Trigger erstellen sollte.

    MfG
     
Thread Status:
Not open for further replies.

Share This Page