Commit 804133f9 authored by M1888's avatar M1888

triggerit

parent f9dd09f0
...@@ -102,6 +102,83 @@ ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers ...@@ -102,6 +102,83 @@ ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers
Kaikki validaatio piti siis tehdä yhden triggerin sisään. Lopulta siitä tuli tällainen hirvitys: Kaikki validaatio piti siis tehdä yhden triggerin sisään. Lopulta siitä tuli tällainen hirvitys:
```SQL
CREATE TRIGGER `ottelutapahtuma_ins` BEFORE INSERT ON `ottelutapahtuma`
FOR EACH ROW
BEGIN
-- kaikki mahdollisesti käytettävät muuttujat on määriteltävä
-- heti BEGIN-blokin alussa...
DECLARE kj INT;
DECLARE vj INT;
DECLARE id INT;
DECLARE id2 INT;
DECLARE joukkue1 INT;
DECLARE joukkue2 INT;
-- Yksi ottelutapahtuma-rivi kuvaa oikeasti vain ja ainoastaan yhtä tapahtumaa:
-- aikalisää, jäähyä, rankkaria tai maalia.
IF ((CASE WHEN NEW.aikalisa_id IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN NEW.jaahy_id IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN NEW.rankkari_id IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN NEW.maali_id IS NULL THEN 0 ELSE 1 END) != 1) THEN
CALL `ottelutapahtuma_liikaa_tapahtumia`;
END IF;
SET kj = (SELECT kotijoukkue FROM ottelu WHERE ottelu_id = NEW.ottelu_id);
SET vj = (SELECT vierasjoukkue FROM ottelu WHERE ottelu_id = NEW.ottelu_id);
-- aikalisän voi pitää vain otteluun kuuluva joukkue
IF (NEW.aikalisa_id IS NOT NULL) THEN
SET id = (SELECT joukkue_id FROM aikalisa WHERE aikalisa_id = NEW.aikalisa_id);
IF (id NOT IN (kj, vj)) THEN
CALL `aikalisa_vaara_joukkue`;
END IF;
END IF;
-- jäähylle voi joutua vain pelaaja, joka on joukueessa joka pelaa kys. ottelua
IF (NEW.jaahy_id IS NOT NULL) THEN
SET id = (SELECT pelaaja_id FROM jaahy WHERE jaahy_id = NEW.jaahy_id);
IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN
CALL `jaahy_vaara_pelaaja`;
END IF;
END IF;
-- rankkarin voi tehdä vain oikeaan joukkueeseen kuuluva pelaaja
IF (NEW.rankkari_id IS NOT NULL) THEN
SET id = (SELECT pelaaja_id FROM rangaistuslaukaus WHERE rankkari_id = NEW.rankkari_id);
IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN
CALL `rankkari_vaara_pelaaja`;
END IF;
END IF;
IF (NEW.maali_id IS NOT NULL) THEN
-- maalin voi tehdä vain otteluun kuuluva joukkue.
SET id = (SELECT joukkue_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id NOT IN (kj, vj)) THEN
CALL `maali_vaara_joukkue`;
END IF;
-- maalin voi tehdä vain pelaaja, joka kuuluu jompaan kumpaan joukkueeseen.
SET id = (SELECT pelaaja_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN
CALL `maali_vaara_pelaaja`;
END IF;
-- syöttäjän pitää kuulua samaan joukkueeseen, kuin maalin tekijä
SET id2 = (SELECT syottaja_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id2 IS NOT NULL) THEN
SET joukkue1 = (SELECT joukkue_id FROM sopimus WHERE pelaaja_id = id);
SET joukkue2 = (SELECT joukkue_id FROM sopimus WHERE pelaaja_id = id2);
IF (joukkue1 != joukkue2) THEN
CALL `maali_vaara_syottaja`;
END IF;
END IF;
END IF;
END//
```
Nämä triggerit lisäsin kannan luontiskriptin loppuun. Sitten oli aika lähteä lisäilemään tietoa kantaan.
### 2. [insert-teams.sql](insert-teams.sql) ### 2. [insert-teams.sql](insert-teams.sql)
Alkuun lisättiin neljä kaupunkia, niiden areenat ja joukkueet. Alkuun lisättiin neljä kaupunkia, niiden areenat ja joukkueet.
......
...@@ -317,18 +317,20 @@ CREATE TRIGGER `ottelutapahtuma_ins` BEFORE INSERT ON `ottelutapahtuma` ...@@ -317,18 +317,20 @@ CREATE TRIGGER `ottelutapahtuma_ins` BEFORE INSERT ON `ottelutapahtuma`
END IF; END IF;
END IF; END IF;
-- maalin voi tehdä vain otteluun kuuluva joukkue.
-- maalin voi tehdä vain pelaaja, joka kuuluu jompaan kumpaan joukkueeseen.
IF (NEW.maali_id IS NOT NULL) THEN IF (NEW.maali_id IS NOT NULL) THEN
-- maalin voi tehdä vain otteluun kuuluva joukkue.
SET id = (SELECT joukkue_id FROM maali WHERE maali_id = NEW.maali_id); SET id = (SELECT joukkue_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id NOT IN (kj, vj)) THEN IF (id NOT IN (kj, vj)) THEN
CALL `maali_vaara_joukkue`; CALL `maali_vaara_joukkue`;
END IF; END IF;
-- maalin voi tehdä vain pelaaja, joka kuuluu jompaan kumpaan joukkueeseen.
SET id = (SELECT pelaaja_id FROM maali WHERE maali_id = NEW.maali_id); SET id = (SELECT pelaaja_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN
CALL `maali_vaara_pelaaja`; CALL `maali_vaara_pelaaja`;
END IF; END IF;
-- syöttäjän pitää kuulua samaan joukkueeseen, kuin maalin tekijä
SET id2 = (SELECT syottaja_id FROM maali WHERE maali_id = NEW.maali_id); SET id2 = (SELECT syottaja_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id2 IS NOT NULL) THEN IF (id2 IS NOT NULL) THEN
SET joukkue1 = (SELECT joukkue_id FROM sopimus WHERE pelaaja_id = id); SET joukkue1 = (SELECT joukkue_id FROM sopimus WHERE pelaaja_id = id);
...@@ -389,18 +391,20 @@ CREATE TRIGGER `ottelutapahtuma_upd` BEFORE UPDATE ON `ottelutapahtuma` ...@@ -389,18 +391,20 @@ CREATE TRIGGER `ottelutapahtuma_upd` BEFORE UPDATE ON `ottelutapahtuma`
END IF; END IF;
END IF; END IF;
-- maalin voi tehdä vain otteluun kuuluva joukkue.
-- maalin voi tehdä vain pelaaja, joka kuuluu jompaan kumpaan joukkueeseen.
IF (NEW.maali_id IS NOT NULL) THEN IF (NEW.maali_id IS NOT NULL) THEN
-- maalin voi tehdä vain otteluun kuuluva joukkue.
SET id = (SELECT joukkue_id FROM maali WHERE maali_id = NEW.maali_id); SET id = (SELECT joukkue_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id NOT IN (kj, vj)) THEN IF (id NOT IN (kj, vj)) THEN
CALL `maali_vaara_joukkue`; CALL `maali_vaara_joukkue`;
END IF; END IF;
-- maalin voi tehdä vain pelaaja, joka kuuluu jompaan kumpaan joukkueeseen.
SET id = (SELECT pelaaja_id FROM maali WHERE maali_id = NEW.maali_id); SET id = (SELECT pelaaja_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN IF (id NOT IN (SELECT pelaaja_id FROM sopimus WHERE joukkue_id IN (kj, vj))) THEN
CALL `maali_vaara_pelaaja`; CALL `maali_vaara_pelaaja`;
END IF; END IF;
-- syöttäjän pitää kuulua samaan joukkueeseen, kuin maalin tekijä
SET id2 = (SELECT syottaja_id FROM maali WHERE maali_id = NEW.maali_id); SET id2 = (SELECT syottaja_id FROM maali WHERE maali_id = NEW.maali_id);
IF (id2 IS NOT NULL) THEN IF (id2 IS NOT NULL) THEN
SET joukkue1 = (SELECT joukkue_id FROM sopimus WHERE pelaaja_id = id); SET joukkue1 = (SELECT joukkue_id FROM sopimus WHERE pelaaja_id = id);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment