Ik ben bezig met een cursus databases en in deze cursus wordt veel met interbase gewerkt. Ik heb gedurende deze cursus een database opgezet voor een voor mij vatbar probleem. Deze stel ik telkens bij als ik weer wat nieuws geleerd heb. Ik ben nu wat aan het experimenteren met MySQL.
Het probleem
Ik wil regels toevoegen aan de database.
Zoektocht
In mijn zoektocht ben ik o.a. de volgende pagina's tegen gekomen:
http://dev.mysql.com/ - Voornamelijk het hoofdstuk over triggers
[google=mysql exception]
[google=mysql trigger throw exception]
Testcase
De orderdatum moet gelijk zijn aan de systeemdatum.
De opdracht geeft geen foutmeldingen of warnings, maar de check constraint wordt genegeerd. Om het probleem te omzeilen wil ik dus een trigger die een exception genereerd. Volgende poging:
Dit wordt niet door MySQL ondersteund. Ik kom nu bij de volgende (werkende) code, maar dit is niet wat ik wil. Ik wil een foutmelding.
Ik kan niet in de documentatie van MySQL terug vinden hoe ik een exception kan genereren. Het moet wel kunnen getuige:
Het probleem
Ik wil regels toevoegen aan de database.
Zoektocht
In mijn zoektocht ben ik o.a. de volgende pagina's tegen gekomen:
http://dev.mysql.com/ - Voornamelijk het hoofdstuk over triggers
[google=mysql exception]
[google=mysql trigger throw exception]
Testcase
De orderdatum moet gelijk zijn aan de systeemdatum.
SQL:
1
2
3
4
5
6
7
8
| CREATE TABLE Orders ( ordernr INT UNSIGNED NOT NULL, orderdatum DATE NOT NULL, CONSTRAINT pk_order PRIMARY KEY (ordernr), CONSTRAINT ch_orderdatum CHECK (orderdatum = CURRENT_DATE) ) ENGINE = INNODB; |
De opdracht geeft geen foutmeldingen of warnings, maar de check constraint wordt genegeerd. Om het probleem te omzeilen wil ik dus een trigger die een exception genereerd. Volgende poging:
SQL:
1
| CREATE EXCEPTION E_Date 'Ongeldige datum invoer'; |
Dit wordt niet door MySQL ondersteund. Ik kom nu bij de volgende (werkende) code, maar dit is niet wat ik wil. Ik wil een foutmelding.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| DELIMITER // CREATE TRIGGER T_BI_Orders BEFORE INSERT ON Orders FOR EACH ROW BEGIN IF NEW.orderdatum <> CURRENT_DATE THEN -- Exception SET NEW.orderdatum = CURRENT_DATE; END IF; END;// DELIMITER ; INSERT INTO Orders VALUES (1, CURRENT_DATE); INSERT INTO Orders VALUES (2, CURRENT_DATE - 1); |
Ik kan niet in de documentatie van MySQL terug vinden hoe ik een exception kan genereren. Het moet wel kunnen getuige:
Hoe zou ik dit op kunnen lossen?If a BEFORE trigger fails, the operation on the corresponding row is not performed.
You don't have to be crazy to do this job, but it helps ....