Dette ser ud til at være en kopi af Afspil framework 2.0-evolutioner og opret trigger (Bemærk, at efter min mening er det bedre svar det, der blev indsendt af Roger den 24. maj 2013, dvs. linket ovenfor)
"delimiter" kan ikke bruges i evolution script-teksten; Jeg kan tilsyneladende ikke finde nogen dokumentation for, hvorfor det er sådan. Men måske hænger det sammen med, at "afgrænser" ikke er en SQL-sætning, men en SQL-egenskab.
Der er dog en løsning i Evolutions-sektionen i Play 2-dokumenter :
Play opdeler dine .sql-filer i en række semikolon-separerede sætninger, før de udføres én efter én mod databasen. Så hvis du skal bruge et semikolon i et udsagn, skal du undslippe det ved at indtaste;; i stedet for;. F.eks. INSERT INTO tegnsætning(navn, tegn) VÆRDIER ('semikolon', ';;');.
Så i dit tilfælde,
- Fjern egenskaben "afgrænser", og
- Brug ";;" i stedet for ";" for dit indre SQL-sætninger, for at forhindre Play 2-parseren i at udføre disse indre SQL-sætninger separat.
Her er et eksempel, som jeg med succes har testet i Play 2.3 og mysql 14.14 Distrib 5.5.40 (Ubuntu 12.04LTS):
DROP TRIGGER IF EXISTS SOFTWARE_INSERT_CT_TRIGGER;
CREATE TRIGGER SOFTWARE_INSERT_CT_TRIGGER
BEFORE INSERT ON SOFTWARE
FOR EACH ROW
BEGIN
IF NEW.CREATED_TIME = '0000-00-00 00:00:00' THEN
SET NEW.CREATED_TIME = NOW();;
END IF;;
END;
I tilfælde af dit SQL-script burde følgende fungere med Play 2.1 og nyere (Bemærk, at jeg ikke har testet det):
DROP TRIGGER IF EXISTS invoice_line_insert;
CREATE TRIGGER invoice_line_insert AFTER INSERT
ON invoice_line FOR EACH ROW
BEGIN
IF NEW.type = "DELIVERY" THEN
UPDATE invoice
SET invoice.etdelivery_amount = invoice.etdelivery_amount + NEW.amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
ELSE
UPDATE invoice
SET invoice.etexpense_amount = invoice.etexpense_amount + NEW.amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END IF;;
UPDATE invoice
SET invoice.vatamount = (NEW.amount * ((
SELECT vat.rate
FROM vat
WHERE vat.id_vat = NEW.vat_id_vat
) / 100)) + invoice.vatamount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
UPDATE invoice
SET invoice.itamount = invoice.vatamount +
invoice.etdelivery_amount +
invoice.etexpense_amount
WHERE invoice.id_invoice = NEW.invoice_parent_id_invoice;;
END;