Cela semble être un doublon de Play framework 2.0 evolutions and create trigger (Notez que, selon moi, la meilleure réponse est celle postée par Roger le 24 mai 2013, c'est-à-dire le lien ci-dessus)
"délimiteur" ne peut pas être utilisé dans le texte du script d'évolution ; Je n'arrive pas à trouver de documentation expliquant pourquoi il en est ainsi. Mais peut-être que cela a à voir avec le fait que "delimiter" n'est pas une instruction SQL mais une propriété SQL.
Cependant, il existe une solution dans la section Evolutions de Play 2 docs :
Play divise vos fichiers .sql en une série d'instructions délimitées par des points-virgules avant de les exécuter une par une dans la base de données. Ainsi, si vous avez besoin d'utiliser un point-virgule dans une instruction, échappez-le en saisissant ;; à la place de;. Par exemple, INSERT INTO punctuation(nom, caractère) VALUES ('point-virgule', ';;');.
Donc dans votre cas,
- Supprimez la propriété "delimiter", et
- Utilisez " ; " à la place de ";" pour votre intérieur instructions SQL, afin d'empêcher l'analyseur Play 2 d'exécuter ces instructions SQL internes séparément.
Voici un exemple que j'ai testé avec succès dans Play 2.3 et 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;
Dans le cas de votre script SQL, les éléments suivants devraient fonctionner avec Play 2.1 et versions ultérieures (notez que je ne l'ai pas testé) :
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;