DELIMITER $$ DROP TRIGGER IF EXISTS `schauspieler_bri`$$ CREATE TRIGGER `schauspieler_bri` BEFORE INSERT ON Schauspieler FOR EACH ROW BEGIN IF NOT film_pub_chk_geburtstag(NEW.Geburtstag) THEN SIGNAL SQLSTATE '60000' SET MESSAGE_TEXT = 'Geburtstag ist ungültig!'; END IF; END $$ DROP TRIGGER IF EXISTS `schauspieler_bru`$$ CREATE TRIGGER `schauspieler_bru` BEFORE UPDATE ON Schauspieler FOR EACH ROW BEGIN IF NOT film_pub_chk_geburtstag(NEW.Geburtstag) THEN SIGNAL SQLSTATE '60001' SET MESSAGE_TEXT = 'Geburtstag ist ungültig!'; END IF; END $$ DROP TRIGGER IF EXISTS `reservierung_bri`$$ CREATE TRIGGER `reservierung_bri` BEFORE INSERT ON Reservierung FOR EACH ROW BEGIN -- Logging INSERT INTO Reservierung_Log (ID, Vorname, Nachname, Mail, fk_Vorstellung_ID, VorheigeID, Zeitstempel, is_Erfolgreich, Methode) VALUES (NEW.ID, NEW.Vorname, NEW.Nachname, NEW.Mail, NEW.fk_Vorstellung_ID, NULL, CURRENT_TIMESTAMP(), 0, 'insert'); SET @letzte_reservation_ID = LAST_INSERT_ID(); -- Check Mail IF NOT res_pub_chk_mail(NEW.Mail) THEN SIGNAL SQLSTATE '60020' SET MESSAGE_TEXT = 'Mail-Adresse ist ungültig!'; END IF; END $$ DROP TRIGGER IF EXISTS `reservierung_bru`$$ CREATE TRIGGER `reservierung_bru` BEFORE UPDATE ON Reservierung FOR EACH ROW BEGIN -- Logging INSERT INTO Reservierung_Log (ID, Vorname, Nachname, Mail, fk_Vorstellung_ID, VorheigeID, Zeitstempel, is_Erfolgreich, Methode) VALUES (NEW.ID, NEW.Vorname, NEW.Nachname, NEW.Mail, NEW.fk_Vorstellung_ID, OLD.ID, CURRENT_TIMESTAMP(), 0, 'insert'); SET @letzte_reservation_ID = LAST_INSERT_ID(); -- Check Mail IF NOT res_pub_chk_mail(NEW.Mail) THEN SIGNAL SQLSTATE '60021' SET MESSAGE_TEXT = 'Mail-Adresse ist ungültig!'; END IF; END $$ DROP TRIGGER IF EXISTS `reservierung_brd`$$ CREATE TRIGGER `reservierung_brd` BEFORE DELETE ON Reservierung FOR EACH ROW BEGIN -- Logging INSERT INTO Reservierung_Log (VorheigeID, Zeitstempel, is_Erfolgreich, Methode) VALUES (OLD.ID, CURRENT_TIMESTAMP(), 0, 'delete'); SET @letzte_reservation_ID = LAST_INSERT_ID(); END $$ DROP TRIGGER IF EXISTS `reservierung_ari`$$ CREATE TRIGGER `reservierung_ari` AFTER INSERT ON Reservierung FOR EACH ROW BEGIN -- Logging UPDATE Reservierung_Log SET is_Erfolgreich=1, ID=NEW.ID WHERE LogID=@letzte_reservation_ID; END $$ DROP TRIGGER IF EXISTS `reservierung_aru`$$ CREATE TRIGGER `reservierung_aru` AFTER UPDATE ON Reservierung FOR EACH ROW BEGIN -- Logging UPDATE Reservierung_Log SET is_Erfolgreich=1 WHERE LogID=@letzte_reservation_ID; END $$ DROP TRIGGER IF EXISTS `reservierung_ard`$$ CREATE TRIGGER `reservierung_ard` AFTER DELETE ON Reservierung FOR EACH ROW BEGIN -- Logging UPDATE Reservierung_Log SET is_Erfolgreich=1 WHERE LogID=@letzte_reservation_ID; END $$ DROP TRIGGER IF EXISTS `sitzplatz_bri`$$ CREATE TRIGGER `sitzplatz_bri` BEFORE INSERT ON Sitzplatz FOR EACH ROW BEGIN IF NEW.Preis>100 THEN SIGNAL SQLSTATE '60030' SET MESSAGE_TEXT = 'Preis ist ungültig! Ein Sitzplatz darf maximal 100€ kosten.'; END IF; END $$ DROP TRIGGER IF EXISTS `sitzplatz_bru`$$ CREATE TRIGGER `sitzplatz_bru` BEFORE UPDATE ON Sitzplatz FOR EACH ROW BEGIN IF NEW.Preis>100 THEN SIGNAL SQLSTATE '60031' SET MESSAGE_TEXT = 'Preis ist ungültig! Ein Sitzplatz darf maximal 100€ kosten.'; END IF; END $$ DROP TRIGGER IF EXISTS `nm_reservierung_sitzplatz_bri` $$ CREATE TRIGGER `nm_reservierung_sitzplatz_bri` BEFORE INSERT ON nm_Reservierung_Sitzplatz FOR EACH ROW BEGIN IF EXISTS( SELECT fk_Sitzplatz_ID FROM nm_Reservierung_Sitzplatz nm JOIN Reservierung re ON nm.fk_Reservierung_ID = re.ID WHERE (re.fk_Vorstellung_ID=(SELECT r.fk_Vorstellung_ID FROM Reservierung r WHERE r.ID=NEW.fk_Reservierung_ID)) AND fk_Sitzplatz_ID=NEW.fk_Sitzplatz_ID ) THEN SIGNAL SQLSTATE '60040' SET MESSAGE_TEXT = 'Sitzplatz ist für diese Vorstellung bereits reserviert!'; END IF; END $$ DROP TRIGGER IF EXISTS `nm_reservierung_sitzplatz_bru` $$ CREATE TRIGGER `nm_reservierung_sitzplatz_bru` BEFORE UPDATE ON nm_Reservierung_Sitzplatz FOR EACH ROW BEGIN IF EXISTS( SELECT fk_Sitzplatz_ID FROM nm_Reservierung_Sitzplatz nm JOIN Reservierung re ON nm.fk_Reservierung_ID = re.ID WHERE (re.fk_Vorstellung_ID=(SELECT r.fk_Vorstellung_ID FROM Reservierung r WHERE r.ID=NEW.fk_Reservierung_ID)) AND fk_Sitzplatz_ID=NEW.fk_Sitzplatz_ID ) THEN SIGNAL SQLSTATE '60041' SET MESSAGE_TEXT = 'Sitzplatz ist für diese Vorstellung bereits reserviert!'; END IF; END $$ DROP TRIGGER IF EXISTS `vorstellung_bri` $$ CREATE TRIGGER `vorstellung_bri` BEFORE INSERT ON Vorstellung FOR EACH ROW BEGIN DECLARE v_saalname VARCHAR(50); DECLARE v_spieldauer INTEGER UNSIGNED; SELECT Saal.Name INTO v_saalname FROM Saal WHERE Saal.ID=NEW.fk_Saal_ID; SELECT Film.Spieldauer INTO v_spieldauer FROM Film WHERE Film.ID=NEW.fk_Film_ID; IF EXISTS( SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname FROM v_Vorstellung WHERE v_saalname=Saalname AND NEW.Beginnv_Vorstellung.Beginn ) THEN SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!'; END IF; END $$ DROP TRIGGER IF EXISTS `vorstellung_bru` $$ CREATE TRIGGER `vorstellung_bru` BEFORE UPDATE ON Vorstellung FOR EACH ROW BEGIN DECLARE v_saalname VARCHAR(50); DECLARE v_spieldauer INTEGER UNSIGNED; SELECT Saal.Name INTO v_saalname FROM Saal WHERE Saal.ID=NEW.fk_Saal_ID; SELECT Film.Spieldauer INTO v_spieldauer FROM Film WHERE Film.ID=NEW.fk_Film_ID; IF EXISTS( SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname FROM v_Vorstellung WHERE v_saalname=Saalname AND NEW.Beginnv_Vorstellung.Beginn AND v_Vorstellung.ID <> OLD.ID ) THEN SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!'; END IF; END $$ DROP TRIGGER IF EXISTS `film_bru` $$ CREATE TRIGGER `film_bru` BEFORE UPDATE ON Film FOR EACH ROW BEGIN DECLARE v_saalname VARCHAR(50); DECLARE v_beginn DATETIME; DECLARE vc_vorstellung_col, vc_vorstellung_done INT DEFAULT 0; DECLARE vc_vorstellung CURSOR FOR SELECT ID FROM Vorstellung WHERE fk_Film_ID=NEW.ID; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vc_vorstellung_done = 1; if (NEW.Spieldauer > OLD.Spieldauer) THEN SET vc_vorstellung_done = 0; OPEN vc_vorstellung; FETCH vc_vorstellung INTO vc_vorstellung_col; WHILE NOT vc_vorstellung_done DO SELECT Saal.Name INTO v_saalname FROM Vorstellung JOIN Saal ON Vorstellung.fk_Saal_ID = Saal.ID WHERE Vorstellung.ID=vc_vorstellung_col; SELECT Vorstellung.Beginn INTO v_beginn FROM Vorstellung WHERE Vorstellung.ID=vc_vorstellung_col; IF EXISTS( SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname FROM v_Vorstellung WHERE v_saalname=Saalname AND v_beginnv_Vorstellung.Beginn AND v_Vorstellung.ID <> vc_vorstellung_col ) THEN SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!'; END IF; SET vc_vorstellung_done = 0; FETCH vc_vorstellung INTO vc_vorstellung_col; END WHILE; CLOSE vc_vorstellung; END IF; END $$ DELIMITER ;