Задать вопрос
AlexXYZ
@AlexXYZ
O Keep Clear O

MySql trigger как проверить что при обновлении поле задано?

Всем привет.

Пишу триггер для mysql на обновление записи. Для определения валидности исходных данных нужно убедиться, что указаны определённые поля в операции update:

CREATE TABLE dbcv.cv_translates (
  id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id записи в таблице (ключ)',
  cv_users_id bigint(20) UNSIGNED NOT NULL COMMENT 'id пользователя',
  translate_description varchar(255) DEFAULT '' COMMENT 'Наименование языка (не обязательно)',
  json_version bigint(20) NOT NULL COMMENT 'версия. Обязательно сравнивать перед записью и инкриментировать после записи (выполняется триггером)',
  json_data json NOT NULL COMMENT 'Данные резюме',
  json_history json DEFAULT NULL COMMENT 'История изменений записи json_data',
  date_create timestamp NULL DEFAULT NULL COMMENT 'Дата создания резюме',
  date_update timestamp NULL DEFAULT NULL COMMENT 'Дата изменения',
  PRIMARY KEY (id),
  UNIQUE INDEX UK_cv_translates_id (id),
  CONSTRAINT FK_cv_translates_cv_users_id FOREIGN KEY (cv_users_id)
  REFERENCES dbcv.cv_users (id) ON DELETE NO ACTION ON UPDATE NO ACTION
)
ENGINE = INNODB
AUTO_INCREMENT = 142
AVG_ROW_LENGTH = 93485
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Таблица данных с переводами резюме пользователей'
ROW_FORMAT = DYNAMIC;

Триггер:
CREATE 
	DEFINER = 'root'@'localhost'
TRIGGER dbcv.cv_translates_trigger_update
	BEFORE UPDATE
	ON dbcv.cv_translates
	FOR EACH ROW
BEGIN
  if( NEW.json_data!=OLD.json_data) THEN
    if( NEW.json_version != OLD.json_version ) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ошибка сохранения резюме. Версии данных должны совпадать. (триггер cv_users_trigger_update)';
    END if;
    SET NEW.json_hash=SHA1(NEW.json_data);
    SET NEW.json_version = OLD.json_version+1;
    SET @j = JSON_SET( '{}', '$.json_data', NEW.json_data, '$.json_version', NEW.json_version, '$.json_data_updated', DATE_FORMAT(NOW(), '%Y-%m-%d %T'));
    SET NEW.json_history = JSON_MERGE(OLD.json_history, @j);
    SET NEW.date_update = NOW();
  END if;
END


Вопрос крутится вокруг операции UPDATE:

UPDATE dbcv.cv_translates SET json_data=?, translate_description=? WHERE id=?;


Нужно выдать ошибку, если пользователь в запросе обновления не указал поле json_version. Предполагаю, что условие надо вставить в триггер в строке "if( NEW.json_version != OLD.json_version ) THEN". Но точно не уверен, а существует ли вообще возможность проверить такое условие. В данный момент если поле json_version не задано, то всё работает так, буд-то NEW.json_version == OLD.json_version.

Вопрос - можно ли проверить, что в запросе UPDATE задано поле json_version явно?
  • Вопрос задан
  • 824 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы