Files
mysql-db-vorlesung/03-trigger.sql
Sebastian Seedorf ff6962de52 initial commit
2020-12-06 12:40:52 +01:00

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 ;