Всем привет.
Пишу триггер для 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 явно?