Playframework 2.0 播放Framework2.0演进并创建触发器

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 ; 它抛出的错

我一直在尝试使用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 ;
它抛出的错误如下:


我们得到以下错误:您的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()方法:首先检查触发器是否已经存在,如果不存在,创建它。