Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Erro na instrução do delimitador do MySQL


Parece ser uma duplicata de Jogar evoluções do framework 2.0 e criar gatilho (Observe que, na minha opinião, a melhor resposta é a postada por Roger em 24 de maio de 2013, ou seja, o link acima)

"delimiter" não pode ser usado no texto do script de evolução; Não consigo encontrar nenhuma documentação sobre por que isso é assim. Mas talvez tenha a ver com o fato de que "delimiter" não é uma instrução SQL, mas uma propriedade SQL.

No entanto, há uma solução na seção Evoluções dos documentos do Play 2 :

O Play divide seus arquivos .sql em uma série de instruções delimitadas por ponto e vírgula antes de executá-las uma a uma no banco de dados. Portanto, se você precisar usar um ponto e vírgula em uma instrução, faça escape digitando;; ao invés de;. Por exemplo, pontuação INSERT INTO(nome, caractere) VALUES ('ponto e vírgula', ';;');.

Então, no seu caso,
  1. Remova a propriedade "delimiter" e
  2. Use ";;" ao invés de ";" para o seu interior Instruções SQL, para evitar que o analisador Play 2 execute essas instruções SQL internas separadamente.

Aqui está um exemplo que testei com sucesso no Play 2.3 e no mysql 14.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;

No caso do seu script SQL, o seguinte deve funcionar com o Play 2.1 e superior (observe que não testei):
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;