Playframework 2.0 播放Framework2.0演进并创建触发器
我一直在尝试使用Play 2.0.3创建此触发器。如果我手动运行它,它在MySQL中运行得非常好,但在尝试从游戏中运行它时失败了Playframework 2.0 播放Framework2.0演进并创建触发器,playframework-2.0,Playframework 2.0,我一直在尝试使用Play 2.0.3创建此触发器。如果我手动运行它,它在MySQL中运行得非常好,但在尝试从游戏中运行它时失败了 delimiter | create trigger company_updated before update on company for each row begin set new.updated = CURRENT_TIMESTAMP; end; | delimiter ; 它抛出的错
delimiter |
create trigger company_updated before update on company
for each row begin
set new.updated = CURRENT_TIMESTAMP;
end;
|
delimiter ;
它抛出的错误如下:
我们得到以下错误:您的SQL语法有错误;在尝试运行以下SQL脚本时,请检查与您的MySQL服务器版本对应的手册中第1行[错误:1064,SQLSTATE:42000]处的“delimiter | create trigger company(在公司更新之前更新)附近使用的正确语法:delimiter关键字不是SQL语句,它仅在mysql命令行客户端中使用 尝试删除
分隔符
部分:
create trigger company_updated before update on company
for each row begin
set new.updated = CURRENT_TIMESTAMP;
end;
但正如您所提到的,您可能会遇到以下问题:(这似乎是一个我们无法真正解决的限制。因此,我们目前只是不支持应用程序中的触发器。相反,我们只是覆盖了模型的保存/更新方法
@Override
public void save() {
this.updated = new Date();
this.created = this.updated;
super.save();
}
@Override
public void update() {
this.updated = new Date();
super.update();
}
这曾经是一个bug,在2.1中已经修复。 您可以使用双分号进行转义。这里有文档记录: 因此,您的代码应更改如下:
create trigger company_updated before update on company
for each row begin
set new.updated = CURRENT_TIMESTAMP;;
end;
不需要分隔符语句。Play会将文件拆分为多个查询,一个文件以“;”字符结尾 如果您想创建一个复杂的触发器,您不希望play在分号之后分割您的文件,所以您可以用一个双分号“;”来转义它 每个查询以一个分号结束,在触发器中以双分号结束查询 例如:
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
)) + 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;
这似乎是一个bug…这是让我怀疑Play 2是否真的可以生产的几个bug之一。另一种创建触发器的方法应该是使用一些JDBC连接的Global.onStart()方法:首先检查触发器是否已经存在,如果不存在,创建它。