4

Play 2.0.3 を使用してこのトリガーを作成しようとしています。手動で実行すると MySQL では問題なく動作しますが、Play から実行しようとすると失敗します。

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

スローされるエラーは次のとおりです。

次のエラーが発生しました: SQL 構文にエラーがあります。使用する MySQL サーバーのバージョンに対応するマニュアルを参照して、near 'delimiter | create trigger company_updated before update on company for each row' at line 1 [ERROR:1064, SQLSTATE:42000]、この SQL スクリプトを実行しようとしている間:

4

4 に答える 4

6

これは以前はバグであり、2.1 で修正されました。セミコロンを 2 つ使用してエスケープできます。ここに文書化されています: 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;
于 2013-03-24T14:42:03.977 に答える
3

キーワードはdelimiterSQL ステートメントではなく、mysql コマンド ライン クライアントでのみ使用されます。

delimiterパーツを削除してみてください:

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

しかし、あなたが言ったように、セミコロンで Play バグに遭遇するかもしれません:(

于 2012-09-18T19:01:10.880 に答える
0

これは、実際には回避できない制限のようです。そのため、現在、アプリでトリガーをサポートしていません。代わりに、モデルの保存/更新メソッドをオーバーライドしているだけです...

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

@Override
public void update() {
    this.updated = new Date();
    super.update();
}
于 2012-09-18T20:20:36.060 に答える
0

区切りステートメントは必要ありません。Play はファイルを複数のクエリに分割し、1 つのファイルは「;」で終了します。キャラクター。

複雑なトリガーを作成したい場合は、play がセミコロンの後でファイルを分割したくないので、二重のセミコロン ";;" でエスケープします。

各クエリは 1 つのセミコロンで終了し、トリガー内ではクエリを 2 つのセミコロンで終了します。

例 :

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;
于 2014-09-17T08:04:02.257 に答える