Ошибка при выполнении триггеров с условием IF и РАЗДЕЛИТЕЛЕМ в node.js

#mysql #node.js

Вопрос:

Ошибка выполнения следующего кода в узле с npm mysql.

Язык кодирования: Node.js

База данных: MySQL

NPM: mysql

Запрос:

 DELIMITER $
CREATE TRIGGER db_name.TS_UPDATE BEFORE UPDATE ON db_name.Ticket_Service__c
FOR EACH ROW BEGIN
  IF (NEW.Service_Date_Time__c <> OLD.Service_Date_Time__c || NEW.Status__c <> OLD.Status__c || NEW.Worker__c <> OLD.Worker__c || NEW.Service__c <> OLD.Service__c || NEW.Duration__c <> OLD.Duration__c || NEW.Net_Price__c <> OLD.Net_Price__c || NEW.IsDeleted <> OLD.IsDeleted) THEN
        INSERT INTO db_name.Appointment_History__c SET Appt_Ticket__c = NEW.Appt_Ticket__c, Change__c = JSON_OBJECT('table', 'Ticket_Service__c', 'type', 'UPDATE', 'new', JSON_OBJECT('Service_Date_Time__c', NEW.Service_Date_Time__c, 'Status__c', NEW.Status__c, 'Worker__c', NEW.Worker__c, 'Service__c', NEW.Service__c, 'Duration__c', NEW.Duration__c, 'Net_Price__c', NEW.Net_Price__c, 'IsDeleted', NEW.IsDeleted), 'old', JSON_OBJECT('Service_Date_Time__c', OLD.Service_Date_Time__c, 'Status__c', OLD.Status__c, 'Worker__c', OLD.Worker__c, 'Service__c', OLD.Service__c, 'Duration__c', OLD.Duration__c, 'Net_Price__c', OLD.Net_Price__c, 'IsDeleted', OLD.IsDeleted)), CreatedById = NEW.LastModifiedById, CreatedDate = NEW.LastModifiedDate;
  END IF;
END$
DELIMITER ;
 

Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELIMITER $$

Если я выполню запрос без РАЗДЕЛИТЕЛЯ, как показано ниже

 CREATE TRIGGER db_name.TS_UPDATE BEFORE UPDATE ON db_name.Ticket_Service__c
    FOR EACH ROW BEGIN
      IF (NEW.Service_Date_Time__c <> OLD.Service_Date_Time__c || NEW.Status__c <> OLD.Status__c || NEW.Worker__c <> OLD.Worker__c || NEW.Service__c <> OLD.Service__c || NEW.Duration__c <> OLD.Duration__c || NEW.Net_Price__c <> OLD.Net_Price__c || NEW.IsDeleted <> OLD.IsDeleted) THEN
            INSERT INTO db_name.Appointment_History__c SET Appt_Ticket__c = NEW.Appt_Ticket__c, Change__c = JSON_OBJECT('table', 'Ticket_Service__c', 'type', 'UPDATE', 'new', JSON_OBJECT('Service_Date_Time__c', NEW.Service_Date_Time__c, 'Status__c', NEW.Status__c, 'Worker__c', NEW.Worker__c, 'Service__c', NEW.Service__c, 'Duration__c', NEW.Duration__c, 'Net_Price__c', NEW.Net_Price__c, 'IsDeleted', NEW.IsDeleted), 'old', JSON_OBJECT('Service_Date_Time__c', OLD.Service_Date_Time__c, 'Status__c', OLD.Status__c, 'Worker__c', OLD.Worker__c, 'Service__c', OLD.Service__c, 'Duration__c', OLD.Duration__c, 'Net_Price__c', OLD.Net_Price__c, 'IsDeleted', OLD.IsDeleted)), CreatedById = NEW.LastModifiedById, CreatedDate = NEW.LastModifiedDate;
      END IF;
 

Я получил следующую ошибку

 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 5
 

Комментарии:

1. По моему опыту, почти невозможно исправить синтаксис SQL для адаптера mysql в javascript/Node. Вместо этого я бы изучил ORM, например, TypeORM, Возражение или продолжение.

Ответ №1:

DELIMITER распознается только клиентом командной строки mysql. Его единственная цель-помочь устранить двусмысленность между точками с запятой, которые находятся внутри тела сохраненной процедуры, и точка с запятой, которая завершает весь CREATE оператор.

Так как большинство API запросов программирования по умолчанию не поддерживают многозадачность, в этом нет необходимости DELIMITER . Даже если тело вашего триггера может содержать точки с запятой, SQL-анализатор сервера знает, что нужно просто продолжать читать до последнего END .

Поэтому не используйте DELIMITER , если вы выполняете SQL-запросы программно.

Комментарии:

1. Спасибо, Билл. Но когда я выполняю запрос без разделителя, если условие выдает ошибки.