Đây dường như là bản sao của các diễn biến của Play framework 2.0 và tạo trình kích hoạt (Lưu ý rằng, theo quan điểm của tôi, câu trả lời hay hơn là câu trả lời được đăng bởi Roger vào ngày 24 tháng 5 năm 2013, tức là liên kết ở trên)
"dấu phân tách" không thể được sử dụng trong văn bản tập lệnh tiến hóa; Tôi dường như không thể tìm thấy bất kỳ tài liệu nào giải thích tại sao lại như vậy. Nhưng có lẽ nó liên quan đến thực tế là "dấu phân tách" không phải là một câu lệnh SQL mà là một thuộc tính SQL.
Tuy nhiên, có một giải pháp trong phần phần Diễn biến của tài liệu Play 2 :
Play tách các tệp .sql của bạn thành một loạt các câu lệnh được phân tách bằng dấu chấm phẩy trước khi thực thi từng câu một trên cơ sở dữ liệu. Vì vậy, nếu bạn cần sử dụng dấu chấm phẩy trong một câu lệnh, hãy thoát nó bằng cách nhập;; thay vì;. Ví dụ:CHÈN VÀO dấu câu (tên, ký tự) GIÁ TRỊ ('dấu chấm phẩy', ';;');.
Vì vậy, trong trường hợp của bạn,
- Xóa thuộc tính "dấu phân cách" và
- Sử dụng ";;" thay vì ";" cho nội tâm của bạn Câu lệnh SQL, để ngăn trình phân tích cú pháp Play 2 thực thi các câu lệnh SQL bên trong này một cách riêng biệt.
Đây là một ví dụ mà tôi đã thử nghiệm thành công trong Play 2.3 và 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;
Trong trường hợp tập lệnh SQL của bạn, phần sau sẽ hoạt động với Play 2.1 trở lên (Lưu ý rằng tôi chưa thử nghiệm nó):
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;