玩框架2.0的演变和创建触发器(Play framework 2.0 evolutions and

2019-09-22 14:24发布

我一直在试图让使用播放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语法错误; 检查对应于你的MySQL服务器版本的手册正确的语法使用近“分隔符| CREATE TRIGGER在1号线更新之前company_updated对公司的每一行” [错误:1064 SQLSTATE:42000],试图运行该SQL脚本:

Answer 1:

delimiter的关键字是不是一个SQL语句,它只是在mysql命令行客户端使用。

尝试删除delimiter部分:

create trigger company_updated before update on company
    for each row begin
        set new.updated = CURRENT_TIMESTAMP;
    end;

但正如你所说,你可能会碰到一个游戏漏洞与分号 :(



Answer 2:

过去,这是一个错误,并已被固定在2.1。 您可以使用双分号逃跑。 它在这里记载: http://www.playframework.com/documentation/2.1.0/Evolutions

所以,你的代码应该更改如下:

create trigger company_updated before update on company
    for each row begin
        set new.updated = CURRENT_TIMESTAMP;;
end;


Answer 3:

这似乎是我们不能真正解决的限制。 所以,我们目前在我们的应用程序只是不支持触发器。 相反,我们只是重写我们的模型的保存/更新方法...

@Override
public void save() {
    this.updated = new Date();
    this.created = this.updated;
    super.save();
}

@Override
public void update() {
    this.updated = new Date();
    super.update();
}


Answer 4:

没有必要为一个分隔符声明。 比赛将您的文件拆分成多个查询,一个文件被结束了“;” 字符。

如果你想创建一个复杂的触发,你并不想打一个分号后您的文件分割,所以你有两个分号转义“;;”。

你最终每个查询有一个分号和触发器中结束了用双分号查询。

例如:

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;


文章来源: Play framework 2.0 evolutions and create trigger