initial commit
This commit is contained in:
138
01-create.sql
Normal file
138
01-create.sql
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
USE db_vorlesung;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS Saal;
|
||||||
|
DROP TABLE IF EXISTS Sitzplatz;
|
||||||
|
DROP TABLE IF EXISTS Reservierung;
|
||||||
|
DROP TABLE IF EXISTS Reservierung_Log;
|
||||||
|
DROP TABLE IF EXISTS Vorstellung;
|
||||||
|
DROP TABLE IF EXISTS Film;
|
||||||
|
DROP TABLE IF EXISTS Schauspieler;
|
||||||
|
DROP TABLE IF EXISTS nm_Reservierung_Sitzplatz;
|
||||||
|
DROP TABLE IF EXISTS nm_Film_Schauspieler;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS Saal (
|
||||||
|
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Name VARCHAR(50) NOT NULL,
|
||||||
|
Beschreibung MEDIUMTEXT,
|
||||||
|
UNIQUE u_saal_name (Name)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS Sitzplatz (
|
||||||
|
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Reihe INTEGER UNSIGNED NOT NULL,
|
||||||
|
Platz INTEGER UNSIGNED NOT NULL,
|
||||||
|
Preis FLOAT UNSIGNED NOT NULL,
|
||||||
|
fk_Saal_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
UNIQUE u_sitzplatz (Reihe, Platz, fk_Saal_ID),
|
||||||
|
CONSTRAINT fk_sitzplatz_saal_id
|
||||||
|
FOREIGN KEY (fk_Saal_ID)
|
||||||
|
REFERENCES Saal (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS Schauspieler (
|
||||||
|
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Vorname VARCHAR(255) NOT NULL,
|
||||||
|
Nachname VARCHAR(255) NOT NULL,
|
||||||
|
Geburtstag DATE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS Film (
|
||||||
|
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Name VARCHAR(255) NOT NULL,
|
||||||
|
Spieldauer INTEGER UNSIGNED NOT NULL,
|
||||||
|
Bewertung FLOAT UNSIGNED NOT NULL,
|
||||||
|
Beschreibung MEDIUMTEXT,
|
||||||
|
INDEX i_film_name (Name)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS Vorstellung (
|
||||||
|
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Beginn DATETIME NOT NULL,
|
||||||
|
fk_Film_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
fk_Saal_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
CONSTRAINT fk_vorstellung_film_id
|
||||||
|
FOREIGN KEY (fk_Film_ID)
|
||||||
|
REFERENCES Film (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE RESTRICT,
|
||||||
|
CONSTRAINT fk_vorstellung_saal_id
|
||||||
|
FOREIGN KEY (fk_Saal_ID)
|
||||||
|
REFERENCES Saal (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE RESTRICT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS Reservierung (
|
||||||
|
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Vorname VARCHAR(255) NOT NULL,
|
||||||
|
Nachname VARCHAR(255) NOT NULL,
|
||||||
|
Mail VARCHAR(255) NOT NULL,
|
||||||
|
fk_Vorstellung_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
INDEX i_reservierung_name (Vorname, Nachname),
|
||||||
|
INDEX i_reservierung_name2 (Nachname),
|
||||||
|
CONSTRAINT fk_reservierung_vorstellung_id
|
||||||
|
FOREIGN KEY (fk_Vorstellung_ID)
|
||||||
|
REFERENCES Vorstellung (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE RESTRICT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE Reservierung_Log LIKE Reservierung;
|
||||||
|
select
|
||||||
|
concat('ALTER TABLE Reservierung_Log', GROUP_CONCAT(' MODIFY COLUMN ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE)) as alter_statement INTO @prep_statement
|
||||||
|
from information_schema.COLUMNS c
|
||||||
|
where
|
||||||
|
c.IS_NULLABLE = 'NO'
|
||||||
|
and c.TABLE_SCHEMA = 'db_vorlesung'
|
||||||
|
and c.TABLE_NAME = 'Reservierung_Log'
|
||||||
|
group by c.TABLE_NAME;
|
||||||
|
PREPARE query_nullable FROM @prep_statement;
|
||||||
|
EXECUTE query_nullable;
|
||||||
|
DEALLOCATE PREPARE query_nullable;
|
||||||
|
|
||||||
|
ALTER TABLE Reservierung_Log DROP PRIMARY KEY;
|
||||||
|
ALTER TABLE Reservierung_Log ADD `LogID` INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY FIRST;
|
||||||
|
ALTER TABLE Reservierung_Log ADD `VorheigeID` INTEGER UNSIGNED;
|
||||||
|
ALTER TABLE Reservierung_Log ADD `Zeitstempel` TIMESTAMP DEFAULT CURRENT_TIMESTAMP() NOT NULL;
|
||||||
|
ALTER TABLE Reservierung_Log ADD `is_Erfolgreich` BIT NOT NULL;
|
||||||
|
ALTER TABLE Reservierung_Log ADD `Methode` ENUM ('insert', 'update', 'delete') NOT NULL;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS nm_Film_Schauspieler (
|
||||||
|
fk_Film_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
fk_Schauspieler_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (fk_Film_ID, fk_Schauspieler_ID),
|
||||||
|
CONSTRAINT fk_nm_film_schauspieler_film_id
|
||||||
|
FOREIGN KEY (fk_Film_ID)
|
||||||
|
REFERENCES Film (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_nm_film_schauspieler_schauspieler_id
|
||||||
|
FOREIGN KEY (fk_Schauspieler_ID)
|
||||||
|
REFERENCES Schauspieler (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS nm_Reservierung_Sitzplatz (
|
||||||
|
fk_Reservierung_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
fk_Sitzplatz_ID INTEGER UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY pk_nm_reservierung_sitzplatz_reservierung (fk_Reservierung_ID, fk_Sitzplatz_ID),
|
||||||
|
CONSTRAINT fk_nm_reservierung_sitzplatz_reservierung_id
|
||||||
|
FOREIGN KEY (fk_Reservierung_ID)
|
||||||
|
REFERENCES Reservierung (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE,
|
||||||
|
CONSTRAINT fk_nm_reservierung_sitzplatz_sitzplatz_id
|
||||||
|
FOREIGN KEY (fk_Sitzplatz_ID)
|
||||||
|
REFERENCES Sitzplatz (ID)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
47
02-views.sql
Normal file
47
02-views.sql
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
DROP VIEW IF EXISTS v_Film;
|
||||||
|
CREATE VIEW v_Film AS
|
||||||
|
SELECT
|
||||||
|
Film.*,
|
||||||
|
GROUP_CONCAT(CONCAT_WS(' ', Schauspieler.Vorname, Schauspieler.Nachname) SEPARATOR ', ') AS SchauspielerListe
|
||||||
|
FROM Film
|
||||||
|
LEFT JOIN nm_Film_Schauspieler ON Film.ID = nm_Film_Schauspieler.fk_Film_ID
|
||||||
|
LEFT JOIN Schauspieler ON nm_Film_Schauspieler.fk_Schauspieler_ID = Schauspieler.ID
|
||||||
|
GROUP BY Film.ID
|
||||||
|
ORDER BY Film.Name ASC, Film.Bewertung DESC
|
||||||
|
;
|
||||||
|
|
||||||
|
DROP VIEW IF EXISTS v_Saal;
|
||||||
|
CREATE VIEW v_Saal AS
|
||||||
|
SELECT
|
||||||
|
Saal.ID, Saal.Name, Saal.Beschreibung,
|
||||||
|
COUNT(Sitzplatz.ID) Sitzanzahl
|
||||||
|
FROM Saal
|
||||||
|
LEFT JOIN Sitzplatz ON Saal.ID = Sitzplatz.fk_Saal_ID
|
||||||
|
GROUP BY Saal.ID, Saal.Name, Saal.Beschreibung
|
||||||
|
ORDER BY Saal.Name
|
||||||
|
;
|
||||||
|
|
||||||
|
DROP VIEW IF EXISTS v_Vorstellung;
|
||||||
|
CREATE VIEW v_Vorstellung AS
|
||||||
|
SELECT
|
||||||
|
Vorstellung.ID,
|
||||||
|
Vorstellung.Beginn,
|
||||||
|
DATE_ADD(Vorstellung.Beginn, INTERVAL v_Film.Spieldauer MINUTE) Ende,
|
||||||
|
v_Film.Name Filmname,
|
||||||
|
v_Film.Beschreibung,
|
||||||
|
v_Film.Bewertung,
|
||||||
|
v_Film.SchauspielerListe,
|
||||||
|
v_Saal.Name Saalname,
|
||||||
|
COUNT(DISTINCT Reservierung.ID) Reservierungen,
|
||||||
|
COUNT(Sitzplatz.ID) Platzreservierungen,
|
||||||
|
CAST(COUNT(Sitzplatz.ID)/v_Saal.Sitzanzahl AS DECIMAL(5, 4)) Ausbuchung,
|
||||||
|
COALESCE(SUM(Sitzplatz.Preis), 0) `Einnahmen`
|
||||||
|
FROM Vorstellung
|
||||||
|
JOIN v_Film ON Vorstellung.fk_Film_ID=v_Film.ID
|
||||||
|
JOIN v_Saal ON Vorstellung.fk_Saal_ID = v_Saal.ID
|
||||||
|
LEFT JOIN Reservierung ON Vorstellung.ID = Reservierung.fk_Vorstellung_ID
|
||||||
|
LEFT JOIN nm_Reservierung_Sitzplatz ON Reservierung.ID = nm_Reservierung_Sitzplatz.fk_Reservierung_ID
|
||||||
|
LEFT JOIN Sitzplatz ON nm_Reservierung_Sitzplatz.fk_Sitzplatz_ID = Sitzplatz.ID
|
||||||
|
GROUP BY Vorstellung.Beginn, v_Film.Spieldauer, v_Film.Name, v_Film.Beschreibung, v_Film.Bewertung, v_Film.SchauspielerListe, v_Saal.Name
|
||||||
|
ORDER BY Vorstellung.Beginn ASC, v_Saal.Name ASC
|
||||||
|
;
|
||||||
248
03-trigger.sql
Normal file
248
03-trigger.sql
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
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 ;
|
||||||
68
04-package-film.sql
Normal file
68
04-package-film.sql
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
DELIMITER $$
|
||||||
|
|
||||||
|
-- Schauspieler-Film-Package
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS film_pub_chk_geburtstag$$
|
||||||
|
CREATE FUNCTION film_pub_chk_geburtstag(p_geburtstag DATETIME)
|
||||||
|
RETURNS BIT
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS(SELECT 1 FROM (SELECT 1) t WHERE p_geburtstag BETWEEN '1900-01-01' AND '2099-12-31')
|
||||||
|
THEN
|
||||||
|
RETURN 1;
|
||||||
|
ELSE
|
||||||
|
RETURN 0;
|
||||||
|
END IF;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS film_priv_search_schauspieler$$
|
||||||
|
CREATE FUNCTION film_priv_search_schauspieler (p_vorname VARCHAR(255), p_nachname VARCHAR(255))
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
DECLARE res INTEGER UNSIGNED;
|
||||||
|
DECLARE EXIT HANDLER FOR 1172 BEGIN
|
||||||
|
SIGNAL SQLSTATE '50000' SET MESSAGE_TEXT = 'Mehr als ein Schauspieler mit dem Namen gefunden!';
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT Schauspieler.ID INTO res FROM Schauspieler WHERE Vorname=p_vorname AND Nachname=p_nachname;
|
||||||
|
|
||||||
|
IF res IS NULL THEN
|
||||||
|
SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Kein Schauspieler mit dem Namen gefunden!';
|
||||||
|
END IF;
|
||||||
|
RETURN res;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS `film_pub_search_film`$$
|
||||||
|
CREATE FUNCTION `film_pub_search_film` (p_filmname VARCHAR(255))
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
DECLARE res INTEGER UNSIGNED;
|
||||||
|
DECLARE EXIT HANDLER FOR 1172 BEGIN
|
||||||
|
SIGNAL SQLSTATE '50010' SET MESSAGE_TEXT = 'Mehr als einen Film mit dem Titel gefunden!';
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT Film.ID INTO res FROM Film WHERE Name=p_filmname;
|
||||||
|
|
||||||
|
IF res IS NULL THEN
|
||||||
|
SIGNAL SQLSTATE '50011' SET MESSAGE_TEXT = 'Keinen Film mit dem Titel gefunden!';
|
||||||
|
END IF;
|
||||||
|
RETURN res;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `film_pub_add_schauspieler_film`$$
|
||||||
|
CREATE PROCEDURE `film_pub_add_schauspieler_film` (p_vorname VARCHAR(255), p_nachname VARCHAR(255), p_filmname VARCHAR(255))
|
||||||
|
BEGIN
|
||||||
|
DECLARE EXIT HANDLER FOR 1062 BEGIN
|
||||||
|
SIGNAL SQLSTATE '50022' SET MESSAGE_TEXT = 'Schauspieler-Film-Beziehung schon vorhanden!';
|
||||||
|
END;
|
||||||
|
|
||||||
|
INSERT INTO nm_Film_Schauspieler (fk_Film_ID, fk_Schauspieler_ID) VALUES (film_pub_search_film(p_filmname), film_priv_search_schauspieler(p_vorname, p_nachname));
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
117
05-package-saal.sql
Normal file
117
05-package-saal.sql
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
DELIMITER $$
|
||||||
|
|
||||||
|
-- Saal-Package
|
||||||
|
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS `saal_pub_search_saal`$$
|
||||||
|
CREATE FUNCTION `saal_pub_search_saal` (p_saalname VARCHAR(255))
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
DECLARE res INTEGER UNSIGNED;
|
||||||
|
|
||||||
|
SELECT Saal.ID INTO res FROM Saal WHERE Name=p_saalname;
|
||||||
|
|
||||||
|
IF res IS NULL THEN
|
||||||
|
SIGNAL SQLSTATE '50101' SET MESSAGE_TEXT = 'Kein Saal mit dem Namen gefunden!';
|
||||||
|
END IF;
|
||||||
|
RETURN res;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS saal_pub_search_sitzplatz_saalID$$
|
||||||
|
CREATE FUNCTION saal_pub_search_sitzplatz_saalID (p_saalID INTEGER UNSIGNED, p_reihe INTEGER UNSIGNED, p_platz INTEGER UNSIGNED)
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
DECLARE res INTEGER UNSIGNED;
|
||||||
|
|
||||||
|
SELECT Sitzplatz.ID INTO res FROM Sitzplatz WHERE fk_Saal_ID=p_saalID AND Reihe=p_reihe AND Platz=p_platz;
|
||||||
|
|
||||||
|
IF res IS NULL THEN
|
||||||
|
SIGNAL SQLSTATE '50111' SET MESSAGE_TEXT = 'Kein Sitzplatz gefunden!';
|
||||||
|
END IF;
|
||||||
|
RETURN res;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS `saal_pub_search_sitzplatz`$$
|
||||||
|
CREATE FUNCTION `saal_pub_search_sitzplatz` (p_saalname VARCHAR(255), p_reihe INTEGER UNSIGNED, p_platz INTEGER UNSIGNED)
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
RETURN saal_pub_search_sitzplatz_saalID(saal_pub_search_saal(p_saalname), p_reihe, p_platz);
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `saal_pub_add_saal3`$$
|
||||||
|
CREATE PROCEDURE `saal_pub_add_saal3` (p_saalname VARCHAR(50))
|
||||||
|
BEGIN
|
||||||
|
CALL saal_pub_add_saal2(p_saalname, NULL);
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `saal_pub_add_saal2`$$
|
||||||
|
CREATE PROCEDURE `saal_pub_add_saal2` (p_saalname VARCHAR(50), p_beschreibung MEDIUMTEXT)
|
||||||
|
BEGIN
|
||||||
|
CALL saal_pub_add_saal(p_saalname, p_beschreibung, 0, 0, 0);
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `saal_pub_add_saal1`$$
|
||||||
|
CREATE PROCEDURE `saal_pub_add_saal1` (p_saalname VARCHAR(50), p_reihen INTEGER UNSIGNED, p_breite INTEGER UNSIGNED, p_preis FLOAT UNSIGNED)
|
||||||
|
BEGIN
|
||||||
|
CALL saal_pub_add_saal(p_saalname, NULL, p_reihen, p_breite, p_preis);
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `saal_pub_add_saal`$$
|
||||||
|
CREATE PROCEDURE `saal_pub_add_saal` (p_saalname VARCHAR(50), p_beschreibung MEDIUMTEXT, p_reihen INTEGER UNSIGNED, p_breite INTEGER UNSIGNED, p_preis FLOAT UNSIGNED)
|
||||||
|
BEGIN
|
||||||
|
DECLARE EXIT HANDLER FOR 1062 BEGIN -- [1062] Duplicate entry 'xxx' for key 'u_saal_name'
|
||||||
|
SIGNAL SQLSTATE '50120' SET MESSAGE_TEXT = 'Saal mit dem Namen existiert bereits!';
|
||||||
|
END;
|
||||||
|
|
||||||
|
INSERT INTO Saal (Name, Beschreibung) VALUES (p_saalname, p_beschreibung);
|
||||||
|
CALL saal_pub_update_preis(p_saalname, 1, p_reihen, 1, p_breite, p_preis);
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `saal_pub_update_preis`$$
|
||||||
|
CREATE PROCEDURE `saal_pub_update_preis` (
|
||||||
|
p_saalname VARCHAR(50),
|
||||||
|
p_start_reihe INTEGER UNSIGNED,
|
||||||
|
p_ende_reihe INTEGER UNSIGNED,
|
||||||
|
p_start_breite INTEGER UNSIGNED,
|
||||||
|
p_ende_breite INTEGER UNSIGNED,
|
||||||
|
p_preis FLOAT UNSIGNED
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
DECLARE v_reihe INTEGER UNSIGNED DEFAULT p_start_reihe;
|
||||||
|
DECLARE v_breite INTEGER UNSIGNED DEFAULT p_start_breite;
|
||||||
|
DECLARE v_saalID INTEGER UNSIGNED DEFAULT saal_pub_search_saal(p_saalname);
|
||||||
|
|
||||||
|
WHILE v_reihe <= p_ende_reihe DO
|
||||||
|
SET v_breite = 1;
|
||||||
|
WHILE v_breite <= p_ende_breite DO
|
||||||
|
INSERT INTO Sitzplatz (Reihe, Platz, fk_Saal_ID, Preis)
|
||||||
|
VALUES (v_reihe, v_breite, v_saalID, p_preis)
|
||||||
|
ON DUPLICATE KEY UPDATE Preis=p_preis;
|
||||||
|
SET v_breite = v_breite+1;
|
||||||
|
END WHILE;
|
||||||
|
SET v_reihe = v_reihe+1;
|
||||||
|
END WHILE;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
13
06-package-vorstellung.sql
Normal file
13
06-package-vorstellung.sql
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
DELIMITER $$
|
||||||
|
|
||||||
|
-- Vorstellung-Package
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `vrst_pub_add_vorstellung`$$
|
||||||
|
CREATE PROCEDURE `vrst_pub_add_vorstellung` (p_saalname VARCHAR(50), p_filmname VARCHAR(255), p_beginn DATETIME)
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO Vorstellung (Beginn, fk_Film_ID, fk_Saal_ID) VALUES (p_beginn, film_pub_search_film(p_filmname), saal_pub_search_saal(p_saalname));
|
||||||
|
END$$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
86
07-package-reservierung.sql
Normal file
86
07-package-reservierung.sql
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
DELIMITER $$
|
||||||
|
|
||||||
|
-- Reservierung-Package
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS res_priv_search_vorstellung$$
|
||||||
|
CREATE FUNCTION res_priv_search_vorstellung (p_saalname VARCHAR(50), p_beginn DATETIME)
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
DECLARE res INTEGER UNSIGNED;
|
||||||
|
DECLARE EXIT HANDLER FOR 1172 BEGIN
|
||||||
|
SIGNAL SQLSTATE '50200' SET MESSAGE_TEXT = 'Mehr als eine Vorstellung gefunden!';
|
||||||
|
END;
|
||||||
|
|
||||||
|
SELECT Vorstellung.ID INTO res FROM Vorstellung WHERE Vorstellung.fk_Saal_ID=saal_pub_search_saal(p_saalname) AND Vorstellung.Beginn=p_beginn;
|
||||||
|
|
||||||
|
IF res IS NULL THEN
|
||||||
|
SIGNAL SQLSTATE '50201' SET MESSAGE_TEXT = 'Keine Vorstellung gefunden!';
|
||||||
|
END IF;
|
||||||
|
RETURN res;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS res_pub_chk_mail$$
|
||||||
|
CREATE FUNCTION res_pub_chk_mail(p_mail VARCHAR(255))
|
||||||
|
RETURNS BIT
|
||||||
|
BEGIN
|
||||||
|
if EXISTS(select 1 from (SELECT p_mail Mail) t where t.Mail REGEXP '^[a-zA-Z0-9][a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,4}$')
|
||||||
|
then
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
end if;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
DROP FUNCTION IF EXISTS `res_pub_reservieren`$$
|
||||||
|
CREATE FUNCTION `res_pub_reservieren` (
|
||||||
|
p_vorstellung_saalname VARCHAR(50),
|
||||||
|
p_vorstellung_beginn DATETIME,
|
||||||
|
p_vorname VARCHAR(255),
|
||||||
|
p_nachname VARCHAR(255),
|
||||||
|
p_mail VARCHAR(255),
|
||||||
|
p_reihe INTEGER UNSIGNED,
|
||||||
|
p_platz INTEGER UNSIGNED
|
||||||
|
)
|
||||||
|
RETURNS INTEGER UNSIGNED
|
||||||
|
BEGIN
|
||||||
|
DECLARE v_reservierungID INTEGER UNSIGNED DEFAULT NULL;
|
||||||
|
|
||||||
|
INSERT INTO Reservierung (Vorname, Nachname, Mail, fk_Vorstellung_ID) VALUES
|
||||||
|
(p_vorname, p_nachname, p_mail, res_priv_search_vorstellung(p_vorstellung_saalname, p_vorstellung_beginn))
|
||||||
|
;
|
||||||
|
SET v_reservierungID = LAST_INSERT_ID();
|
||||||
|
|
||||||
|
INSERT INTO nm_Reservierung_Sitzplatz (fk_Reservierung_ID, fk_Sitzplatz_ID) VALUES
|
||||||
|
(v_reservierungID, saal_pub_search_sitzplatz(p_vorstellung_saalname, p_reihe, p_platz))
|
||||||
|
;
|
||||||
|
RETURN v_reservierungID;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS `res_pub_add_reservieren_sitz`$$
|
||||||
|
CREATE PROCEDURE `res_pub_add_reservieren_sitz` (
|
||||||
|
p_reservierungID INTEGER UNSIGNED,
|
||||||
|
p_reihe INTEGER UNSIGNED,
|
||||||
|
p_platz INTEGER UNSIGNED
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
DECLARE v_saalID INTEGER UNSIGNED DEFAULT 0;
|
||||||
|
|
||||||
|
IF (p_reservierungID IS NULL) THEN
|
||||||
|
SIGNAL SQLSTATE '50210' SET MESSAGE_TEXT = 'Reservierungs-ID darf nicht NULL sein!';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT Vorstellung.fk_Saal_ID INTO v_saalID FROM Reservierung
|
||||||
|
JOIN Vorstellung ON Reservierung.fk_Vorstellung_ID = Vorstellung.ID
|
||||||
|
WHERE Reservierung.ID=p_reservierungID
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT INTO nm_Reservierung_Sitzplatz (fk_Reservierung_ID, fk_Sitzplatz_ID) VALUES
|
||||||
|
(p_reservierungID, saal_pub_search_sitzplatz_saalID(v_saalID, p_reihe, p_platz))
|
||||||
|
;
|
||||||
|
END $$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER ;
|
||||||
141
08-insert.sql
Normal file
141
08-insert.sql
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
-- Tabellen leeren
|
||||||
|
|
||||||
|
DELETE FROM Reservierung;
|
||||||
|
ALTER TABLE Reservierung AUTO_INCREMENT = 1;
|
||||||
|
DELETE FROM Vorstellung;
|
||||||
|
ALTER TABLE Vorstellung AUTO_INCREMENT = 1;
|
||||||
|
DELETE FROM Saal;
|
||||||
|
ALTER TABLE Saal AUTO_INCREMENT = 1;
|
||||||
|
DELETE FROM Film;
|
||||||
|
ALTER TABLE Film AUTO_INCREMENT = 1;
|
||||||
|
DELETE FROM Schauspieler;
|
||||||
|
ALTER TABLE Schauspieler AUTO_INCREMENT = 1;
|
||||||
|
|
||||||
|
|
||||||
|
-- doneTODO Auskommentieren
|
||||||
|
-- DELETE FROM Sitzplatz; -- wird mit den Sälen gelöscht (CASCADE)
|
||||||
|
-- ALTER TABLE Sitzplatz AUTO_INCREMENT = 1;
|
||||||
|
-- DELETE FROM nm_Reservierung_Sitzplatz; -- wird mit Reservierungen oder Sitzplätzen gelöscht (CASCADE)
|
||||||
|
-- ALTER TABLE nm_Reservierung_Sitzplatz AUTO_INCREMENT = 1;
|
||||||
|
-- DELETE FROM nm_Film_Schauspieler; -- wird mit Film oder Schauspieler gelöscht (CASCADE)
|
||||||
|
-- ALTER TABLE nm_Film_Schauspieler AUTO_INCREMENT = 1;
|
||||||
|
-- Auskommentieren Ende
|
||||||
|
|
||||||
|
|
||||||
|
-- Säle und Sitzplätze hinzufügen
|
||||||
|
|
||||||
|
CALL saal_pub_add_saal('Kino 1', 'Saal für Premieren', 50, 35, 10);
|
||||||
|
CALL saal_pub_update_preis('Kino 1', 26, 50, 1, 35, 13); -- Hintere Logen-Plätze sind teurer
|
||||||
|
|
||||||
|
CALL saal_pub_add_saal3('Kino 2');
|
||||||
|
CALL saal_pub_update_preis('Kino 2', 1, 20, 1, 20, 5); -- Saal-Größe auf 20x20 vergrößern
|
||||||
|
CALL saal_pub_update_preis('Kino 2', 11, 20, 1, 20, 7); -- Hintere Logen-Plätze sind teurer
|
||||||
|
|
||||||
|
CALL saal_pub_add_saal2('Kino 3', 'Viel zu kleiner Saal');
|
||||||
|
CALL saal_pub_update_preis('Kino 3', 1, 10, 1, 20, 5); -- Saal ist nicht rechteckig, erste 10 Reihen haben 20 Plätze
|
||||||
|
CALL saal_pub_update_preis('Kino 3', 11, 20, 1, 10, 7); -- Hintere Logen-Plätze sind teurer
|
||||||
|
|
||||||
|
CALL saal_pub_add_saal2('Club A', 'Im Bibliothek-Stil');
|
||||||
|
CALL saal_pub_update_preis('Club A', 1, 12, 1, 5, 15); -- Kleiner Luxus-Saal
|
||||||
|
|
||||||
|
CALL saal_pub_add_saal1('Club B', 12, 5, 5); -- Gemütlicher Saal für kleine Anlässe
|
||||||
|
|
||||||
|
|
||||||
|
-- Schauspieler
|
||||||
|
|
||||||
|
INSERT IGNORE INTO Schauspieler (Vorname, Nachname, Geburtstag) VALUES
|
||||||
|
('Brett', 'Fit', STR_TO_DATE('1.3.1937', '%e.%c.%Y')),
|
||||||
|
('Angela', 'Jolly', STR_TO_DATE('5.4.1965', '%e.%c.%Y')),
|
||||||
|
('Julia', 'Roberto', STR_TO_DATE('5.7.1971', '%e.%c.%Y')),
|
||||||
|
('Arnold', 'Altenpfleger', STR_TO_DATE('1.7.1974', '%e.%c.%Y')),
|
||||||
|
('Dwayne', 'Johnson', STR_TO_DATE('28.2.1957', '%e.%c.%Y')),
|
||||||
|
('Alan', 'Schickman', STR_TO_DATE('30.4.1910', '%e.%c.%Y')),
|
||||||
|
('Robert', 'De Menz', STR_TO_DATE('19.12.1943', '%e.%c.%Y'))
|
||||||
|
;
|
||||||
|
|
||||||
|
-- Filme
|
||||||
|
|
||||||
|
INSERT IGNORE INTO Film (Name, Bewertung, Spieldauer, Beschreibung) VALUES
|
||||||
|
('Alan und die Wundertüte', 4.5, 150, 'Alan ist auf der Reise in ein verstecktes Land. auf dem Weg trifft er einen Zauberer, der ihm ein grünes Pulver verkauft. Nachdem er es anzündete und einatmete, geschah das unverhoffte Wunder!'),
|
||||||
|
('Zweilight', 1.2, 127, 'In einem dunklen lauern zwilichtichtige Gestalten, die als Vampire verkleidet ahnungslose Passanten pranken wollen. Großer genugtuender Gruselspaß!'),
|
||||||
|
('Asterisk und Klammeraffe', 3.4, 186, 'In einer neuen Auflage des Klassikers versucen die beiden Protagonisten den Kaiser Julius Hashtag zu überlisten. Dafür haben sie wieder viele neue Pläne geschmiedet!'),
|
||||||
|
('Tarkan, der Herr des Dschüngels', 5.0, 134, 'Ab Dönerstag im Kino')
|
||||||
|
;
|
||||||
|
|
||||||
|
INSERT IGNORE INTO Film (Name, Bewertung, Spieldauer) VALUES
|
||||||
|
('Mitten im Heben', 4.6, 92),
|
||||||
|
('Alarm für Python 12', 2.9, 102)
|
||||||
|
;
|
||||||
|
|
||||||
|
-- Schauspieler-Film-Beziehungen
|
||||||
|
|
||||||
|
CALL film_pub_add_schauspieler_film('Brett', 'Fit', 'Zweilight');
|
||||||
|
CALL film_pub_add_schauspieler_film('Angela', 'Jolly', 'Zweilight');
|
||||||
|
CALL film_pub_add_schauspieler_film('Robert', 'De Menz', 'Zweilight');
|
||||||
|
|
||||||
|
CALL film_pub_add_schauspieler_film('Julia', 'Roberto', 'Alan und die Wundertüte');
|
||||||
|
CALL film_pub_add_schauspieler_film('Angela', 'Jolly', 'Alan und die Wundertüte');
|
||||||
|
CALL film_pub_add_schauspieler_film('Alan', 'Schickman', 'Alan und die Wundertüte');
|
||||||
|
|
||||||
|
CALL film_pub_add_schauspieler_film('Robert', 'De Menz', 'Asterisk und Klammeraffe');
|
||||||
|
|
||||||
|
CALL film_pub_add_schauspieler_film('Alan', 'Schickman', 'Mitten im Heben');
|
||||||
|
CALL film_pub_add_schauspieler_film('Brett', 'Fit', 'Mitten im Heben');
|
||||||
|
CALL film_pub_add_schauspieler_film('Robert', 'De Menz', 'Mitten im Heben');
|
||||||
|
CALL film_pub_add_schauspieler_film('Julia', 'Roberto', 'Mitten im Heben');
|
||||||
|
|
||||||
|
CALL film_pub_add_schauspieler_film('Julia', 'Roberto', 'Alarm für Python 12');
|
||||||
|
CALL film_pub_add_schauspieler_film('Alan', 'Schickman', 'Alarm für Python 12');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Vorstellungen
|
||||||
|
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 11:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 15:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 18:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 12:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 16:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 11:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 15:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 18:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 12:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 16:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 11:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 15:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 18:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 12:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 16:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 11:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 15:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 18:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 12:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 16:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 11:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 15:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 18:15', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 12:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 16:00', '%e.%c.%Y %H:%i'));
|
||||||
|
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('2.5.2017 21:10', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('3.5.2017 21:10', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('4.5.2017 21:10', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Alan und die Wundertüte', STR_TO_DATE('5.5.2017 20:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 2', 'Alan und die Wundertüte', STR_TO_DATE('6.5.2017 20:00', '%e.%c.%Y %H:%i'));
|
||||||
|
|
||||||
|
CALL vrst_pub_add_vorstellung('Club A', 'Mitten im Heben', STR_TO_DATE('2.5.2017 13:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Club B', 'Mitten im Heben', STR_TO_DATE('3.5.2017 14:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Club A', 'Mitten im Heben', STR_TO_DATE('4.5.2017 13:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Club B', 'Mitten im Heben', STR_TO_DATE('5.5.2017 14:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Club A', 'Mitten im Heben', STR_TO_DATE('6.5.2017 13:00', '%e.%c.%Y %H:%i'));
|
||||||
|
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('2.5.2017 18:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('2.5.2017 22:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Club A', 'Zweilight', STR_TO_DATE('3.5.2017 12:45', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('3.5.2017 22:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('4.5.2017 18:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('4.5.2017 22:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Club A', 'Zweilight', STR_TO_DATE('5.5.2017 12:45', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('5.5.2017 22:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('6.5.2017 18:00', '%e.%c.%Y %H:%i'));
|
||||||
|
CALL vrst_pub_add_vorstellung('Kino 1', 'Zweilight', STR_TO_DATE('6.5.2017 22:00', '%e.%c.%Y %H:%i'));
|
||||||
7060
09-insert-reservierungen.sql
Normal file
7060
09-insert-reservierungen.sql
Normal file
File diff suppressed because it is too large
Load Diff
37
10-testcases.sql
Normal file
37
10-testcases.sql
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
-- -- Eine Sitz in einer Vorstellung mehrfach reservieren
|
||||||
|
-- -- Eine Vorstellung über add_vorstellung mit ungültigem Saal oder Film
|
||||||
|
-- -- Eine Beziehung über add_schauspieler_film mit ungültigem Schauspieler oder Film
|
||||||
|
-- -- Einen Saal über add_saal mit ungültigem Kino
|
||||||
|
-- -- Einen Sitz über reservieren oder add_reservieren_sitz mit ungültiger Position hinzufügen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Keine Schauspieler-Geburtstage vor 1900 und nach 2100
|
||||||
|
INSERT INTO Schauspieler (Vorname, Nachname, Geburtstag) VALUES ('Nicht', 'So', STR_TO_DATE('1.3.2237', '%e.%c.%Y'));
|
||||||
|
INSERT INTO Schauspieler (Vorname, Nachname, Geburtstag) VALUES ('So', 'Auch-Nicht', STR_TO_DATE('1.3.1837', '%e.%c.%Y'));
|
||||||
|
|
||||||
|
-- -- Mit einer ungültigen Mail-Adresse reservieren
|
||||||
|
SET @resID1 := reservieren('Kino 1', STR_TO_DATE('6.5.2017 22:00', '%e.%c.%Y %H:%i'), 'Peter', 'Ustinov', '@gmx.de', 10, 10);
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Keine Preise über 100 Euro für einen Sitz
|
||||||
|
CALL update_preis('Kino 1', 50, 50, 1, 35, 130);
|
||||||
|
CALL update_preis('Kino 1', 50, 50, 1, 35, 100.5);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Überlappende Vorstellungen
|
||||||
|
CALL add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('2.5.2017 21:20', '%e.%c.%Y %H:%i'));
|
||||||
|
UPDATE Film SET Spieldauer=200 WHERE Name='Tarkan, der Herr des Dschüngels';
|
||||||
|
UPDATE Vorstellung
|
||||||
|
SET Beginn = STR_TO_DATE('2.5.2017 14:20', '%e.%c.%Y %H:%i')
|
||||||
|
WHERE ID = 26; -- 2.5.2017 21:10 in Kino 1
|
||||||
|
|
||||||
|
|
||||||
|
-- -- Registrierungen loggen
|
||||||
|
|
||||||
|
-- Schon belegt wird aufgrund der Beschränkungen von MysQL nicht geloggt (kein PRAGMA AUTONOMOUS_TRANSACTION)
|
||||||
|
SET @resID_test := reservieren('Kino 3', STR_TO_DATE('6.5.2017 18:00', '%e.%c.%Y %H:%i'), 'Mark', 'Müller', 'mueller17@gmail.com', 5, 8);
|
||||||
|
CALL add_reservieren_sitz(@resID_test, 5, 9);
|
||||||
|
CALL add_reservieren_sitz(@resID_test, 5, 10);
|
||||||
Reference in New Issue
Block a user