248 lines
7.6 KiB
SQL
248 lines
7.6 KiB
SQL
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.Beginn<v_Vorstellung.Ende
|
|
AND DATE_ADD(NEW.Beginn, INTERVAL v_spieldauer MINUTE)>v_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.Beginn<v_Vorstellung.Ende
|
|
AND DATE_ADD(NEW.Beginn, INTERVAL v_spieldauer MINUTE)>v_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_beginn<v_Vorstellung.Ende
|
|
AND DATE_ADD(v_beginn, INTERVAL NEW.Spieldauer MINUTE)>v_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 ; |