Commit c22c55fb authored by M1888's avatar M1888

trigger

parent 9b55cc4b
...@@ -19,7 +19,17 @@ Vaatimusmäärittelyn pohjalta nousi ainakin seuraavanlaisia käsitteitä: ...@@ -19,7 +19,17 @@ Vaatimusmäärittelyn pohjalta nousi ainakin seuraavanlaisia käsitteitä:
### 1. [create-kendokanta.sql](create-kendokanta.sql) ### 1. [create-kendokanta.sql](create-kendokanta.sql)
Kun kanta oli vihdoin saatu toimimaan, oli aika syöttää tietoja sinne. Kun kannan skeema oli vihdoin kunnossa, oli aika alkaa työstämään rajoittimia ja triggereitä. Yhden hienon CHECK constraintin ehdin jo kirjoittaa, kunnes muistin, että ne eivät MySQL:ssä tehneetkään mitään.
```SQL
CONSTRAINT `CK_tapahtumaid` CHECK (
CASE WHEN aikalisa_id IS NULL THEN 0 ELSE 1 END +
CASE WHEN jaahy_id IS NULL THEN 0 ELSE 1 END +
CASE WHEN rankkari_id IS NULL THEN 0 ELSE 1 END +
CASE WHEN maali_id IS NULL THEN 0 ELSE 1 END = 1)
```
CHECKin kaltaiset rajoitteet pitikin siis toteuttaa triggereillä.
### 2. [insert-teams.sql](insert-teams.sql) ### 2. [insert-teams.sql](insert-teams.sql)
...@@ -128,13 +138,13 @@ mysql> SELECT * FROM Jaahyt_pelaajat ORDER BY minuutit DESC; ...@@ -128,13 +138,13 @@ mysql> SELECT * FROM Jaahyt_pelaajat ORDER BY minuutit DESC;
14 rows in set (0.01 sec) 14 rows in set (0.01 sec)
mysql> SELECT * FROM Jaahyt_joukkue ORDER BY minuutit DESC; mysql> SELECT * FROM Jaahyt_joukkue ORDER BY minuutit DESC;
+---------+----------+ +------------+---------+----------+
| nimi | minuutit | | joukkue_id | nimi | minuutit |
+---------+----------+ +------------+---------+----------+
| Ässät | 00:12:00 | | 4 | Ässät | 00:12:00 |
| KalPa | 00:11:00 | | 2 | KalPa | 00:11:00 |
| JYP | 00:10:00 | | 1 | JYP | 00:10:00 |
| Tappara | 00:08:00 | | 3 | Tappara | 00:08:00 |
+---------+----------+ +------------+---------+----------+
4 rows in set (0.00 sec) 4 rows in set (0.03 sec)
``` ```
...@@ -273,25 +273,11 @@ DELIMITER // ...@@ -273,25 +273,11 @@ DELIMITER //
CREATE TRIGGER `vain_yksi_tapahtuma_ins` BEFORE INSERT ON `ottelutapahtuma` CREATE TRIGGER `vain_yksi_tapahtuma_ins` BEFORE INSERT ON `ottelutapahtuma`
FOR EACH ROW FOR EACH ROW
BEGIN BEGIN
DECLARE count integer; IF ((CASE WHEN aikalisa_id IS NULL THEN 0 ELSE 1 END) +
SET @count = 0; (CASE WHEN jaahy_id IS NULL THEN 0 ELSE 1 END) +
IF new.aikalisa_id IS NOT NULL THEN (CASE WHEN rankkari_id IS NULL THEN 0 ELSE 1 END) +
SET @count = @count + 1; (CASE WHEN maali_id IS NULL THEN 0 ELSE 1 END) != 1) THEN
END IF; CALL `ottelutapahtuma_liikaa_tapahtumia`;
IF new.jaahy_id IS NOT NULL THEN
SET @count = @count + 1;
END IF;
IF new.rankkari_id IS NOT NULL THEN
SET @count = @count + 1;
END IF;
IF new.maali_id IS NOT NULL THEN
SET @count = @count + 1;
END IF;
IF @count != 1 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'ottelutapahtuma check failed';
END IF; END IF;
END// END//
......
...@@ -8,19 +8,20 @@ Tietokanta jääkiekko-otteluiden tapahtumien tallentamiseen. ...@@ -8,19 +8,20 @@ Tietokanta jääkiekko-otteluiden tapahtumien tallentamiseen.
|---|---| |---|---|
| Joeli Hokkanen | M1888@student.jamk.fi | | Joeli Hokkanen | M1888@student.jamk.fi |
Versio: 0.5 (9.4.2019) Versio: 0.8 (12.4.2019)
## Johdanto ## Johdanto
Ohjelmisto tehdään TTZC0800 Tietokannat -kurssin puitteissa harjoitustyönä. Tavoitteena on toteuttaa tietokanta, jonne voidaan tallentaa tietoa jääkiekkojoukkueista, pelaajista, areenoista, otteluista, sekä ottelutapahtumista. Ohjelmisto tehdään TTZC0800 Tietokannat -kurssin puitteissa harjoitustyönä. Tavoitteena on toteuttaa tietokanta, jonne voidaan tallentaa tietoa jääkiekkojoukkueista, pelaajista, areenoista, otteluista, sekä ottelutapahtumista.
Lisäksi toteutetaan MS Access -pohjainen käyttöliittymä tietojen lisäilyä ja raporttien katselua varten. Lisäksi toteutetaan MS Access -pohjainen käyttöliittymä osalle tietokannan ominaisuuksista.
## Yleiskuvus ## Yleiskuvus
Järjestelmä sijoitetaan JAMKin student.labranet.jamk.fi -palvelimelle ja tietokantaratkaisuna on MySQL. Järjestelmä sijoitetaan JAMKin student.labranet.jamk.fi -palvelimelle ja tietokantaratkaisuna on MySQL.
Olettamuksia arkkitehtuurista: Olettamuksia arkkitehtuurista:
- Joukkueilla on kotikaupunki - Joukkueilla on kotikaupunki
- Joukkueilla on sopimuksia pelaajista, sopimukseen kuuluu alku- ja loppupäivä sekä pelinumero - Joukkueilla on sopimuksia pelaajista, sopimukseen kuuluu alku- ja loppupäivä sekä pelinumero
- Kaupunki omistaa areenan - Kaupunki omistaa areenan
...@@ -54,7 +55,7 @@ mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUE ...@@ -54,7 +55,7 @@ mysql> INSERT INTO ottelutapahtuma (tyyppi, tapahtuma_id, ottelu_id, aika) VALUE
Suunnittelupöydältä pyörähti sitten ulos kakkosversio, jossa ottelutapahtuma-taulussa on suoraan oma erillinen foreign key jokaiselle ottelutapahtumatyypille, ja näistä rajoitteen avulla täytetään vain yksi. Taulun pääavain tulee ottelu_id:stä, sekä tästä yhdestä täytetystä foreign keystä. Suunnittelupöydältä pyörähti sitten ulos kakkosversio, jossa ottelutapahtuma-taulussa on suoraan oma erillinen foreign key jokaiselle ottelutapahtumatyypille, ja näistä rajoitteen avulla täytetään vain yksi. Taulun pääavain tulee ottelu_id:stä, sekä tästä yhdestä täytetystä foreign keystä.
Jotta varmistuttiin, että vain yksi näistä vierasavaimista täytetään kerralla, tuli ottelutapahtuma-taululle kirjoitettua vielä seuraavanlainen constraint: Jotta varmistuttiin, että vain yksi näistä vierasavaimista täytetään kerralla, tuli ottelutapahtuma-taululle kirjoitettua vielä seuraavanlainen constraint *(myöhemmin tajusin, että eihän nämä CHECKit toimineet MySQL:ssä)*:
```SQL ```SQL
CONSTRAINT `CK_tapahtumaid` CHECK ( CONSTRAINT `CK_tapahtumaid` CHECK (
...@@ -85,7 +86,6 @@ Mikään ei auttanut vaikka tämän piti toimia hyvin. Olin jo varma, että Stud ...@@ -85,7 +86,6 @@ Mikään ei auttanut vaikka tämän piti toimia hyvin. Olin jo varma, että Stud
![ER final](er_final.png) ![ER final](er_final.png)
## Toiminnot ## Toiminnot
Pakollisia toimintoja ovat ainakin: Pakollisia toimintoja ovat ainakin:
...@@ -96,9 +96,10 @@ Pakollisia toimintoja ovat ainakin: ...@@ -96,9 +96,10 @@ Pakollisia toimintoja ovat ainakin:
4) Pelitapahtumien lisääminen otteluun (maalit, jäähyt, jne) 4) Pelitapahtumien lisääminen otteluun (maalit, jäähyt, jne)
Lisäksi tulisi saada koosteita mm. seuraavista asioista: Lisäksi tulisi saada koosteita mm. seuraavista asioista:
1) Ottelun aikana tehdyt maalit 1) Ottelun aikana tehdyt maalit
2) Joukkueiden tilanne (voitetut-hävityt ottelut/pisteet, jne) 2) Joukkueiden pistepörssi (= voitetut ottelut)
3) Pelaajapörssi 3) Pelaajapörssi (= maalit + syötöt)
## Ulkoiset liittymät ## Ulkoiset liittymät
...@@ -106,4 +107,4 @@ Kannalle toteutetaan MS Access -pohjainen käyttöliittymä tietojen tarkastelua ...@@ -106,4 +107,4 @@ Kannalle toteutetaan MS Access -pohjainen käyttöliittymä tietojen tarkastelua
## Muut ominaisuudet ## Muut ominaisuudet
Suorituskyky: Vasteajat tulisi olla alle sekunnin luokkaa vaativammissakin koosteissa. Suorituskyky: Vasteajat tulisi olla käyttämällämme datamäärällä käytännössä välittömiä. Kannan tulisi skaalautua suuremmillekkin datamäärille.
\ No newline at end of file
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