To wydaje się być duplikatem Graj w ewolucje frameworku 2.0 i utwórz wyzwalacz (Zauważ, że moim zdaniem lepszą odpowiedzią jest ta opublikowana przez Rogera 24 maja 2013 r., tj. powyższy link)
„delimiter” nie może być użyty w tekście skryptu ewolucji; Nie mogę znaleźć żadnej dokumentacji wyjaśniającej, dlaczego tak jest. Ale może ma to związek z faktem, że „delimiter” nie jest instrukcją SQL, ale właściwością SQL.
Istnieje jednak rozwiązanie w sekcji Ewolucje w dokumentacji Play 2 :
Play dzieli pliki .sql na serię instrukcji rozdzielonych średnikami przed wykonaniem ich pojedynczo w bazie danych. Jeśli więc potrzebujesz użyć średnika w wyrażeniu, pomiń go, wpisując;; zamiast;. Na przykład INSERT INTO interpunkcja(nazwa, znak) WARTOŚCI ('średnik', ';;');.
Więc w twoim przypadku
- Usuń właściwość „delimiter” i
- Użyj „;;” zamiast ";" dla twojego wewnętrznego Instrukcje SQL, aby uniemożliwić parserowi Play 2 oddzielne wykonywanie tych wewnętrznych instrukcji SQL.
Oto przykład, który z powodzeniem przetestowałem w Play 2.3 i 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;
W przypadku twojego skryptu SQL, poniższe powinny działać z Play 2.1 i nowszymi (pamiętaj, że tego nie testowałem):
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;