これは、 Framework 2.0の進化を再生し、トリガーを作成する の複製のようです。 (私の見解では、より良い答えは2013年5月24日にRogerによって投稿されたもの、つまり上記のリンクであることに注意してください)
「区切り文字」は、進化スクリプトのテキストでは使用できません。なぜそうなのかについてのドキュメントが見つからないようです。しかし、おそらくそれは「区切り文字」がSQLステートメントではなくSQLプロパティであるという事実と関係があります。
ただし、Play2ドキュメントの
Playは、.sqlファイルを一連のセミコロン区切りのステートメントに分割してから、データベースに対して1つずつ実行します。したがって、ステートメント内でセミコロンを使用する必要がある場合は、;;と入力してセミコロンをエスケープします。それ以外の;。たとえば、INSERT INTO punctuation(name、character)VALUES('semicolon'、';;');。
したがって、あなたの場合、
- 「delimiter」プロパティを削除し、
- 「;;」を使用するそれ以外の ";"あなたの内側のために Play2パーサーがこれらの内部SQLステートメントを個別に実行しないようにするためのSQLステートメント。
これは、Play2.3とmysql14.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;
SQLスクリプトの場合、以下はPlay 2.1以降で機能するはずです(私はテストしていないことに注意してください):
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;