SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.08.2016 20:35:21

sameuser
Участник
Зарегистрирован: 15.08.2016
Сообщений: 6

Журналирование на триггерах

Добрый вечер.

Есть у нас 4 таблицы: клиенты - customers, товары - goods, статус (для товаров) - goods_status и собственно таблица журнала - goods_history_logger


CREATE TABLE IF NOT EXISTS `mydb`.`customers`
(
  `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_email` TINYTEXT NOT NULL,
  `user_password` TINYTEXT NOT NULL,

  PRIMARY KEY (`user_id`)
)

CREATE TABLE IF NOT EXISTS `mydb`.`goods`
(
  `fk_status_id` TINYINT NOT NULL DEFAULT 0,
  `fk_user_id` INT UNSIGNED NOT NULL,
  `goods_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `goods_name` TINYTEXT NOT NULL,
  `goods_amount` SMALLINT UNSIGNED NOT NULL,
  `goods_cost` SMALLINT NOT NULL DEFAULT 0,
  `goods_discount` SMALLINT NOT NULL DEFAULT 0,

  PRIMARY KEY (`goods_id`),

  CONSTRAINT `fk_status_id`
    FOREIGN KEY (`fk_status_id`)
    REFERENCES `mydb`.`goods_status` (`status_id`)
  CONSTRAINT `fk_user_id`
    FOREIGN KEY (`fk_user_id`)
    REFERENCES `mydb`.`customers` (`user_id`)
)

CREATE TABLE IF NOT EXISTS `mydb`.`goods_status`
(
  `status_id` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `status_name` TINYTEXT NOT NULL,

  PRIMARY KEY (`status_id`)
)


CREATE TABLE IF NOT EXISTS `mydb`.`goods_history_logger`
(
  `fk_log_goods_id` INT UNSIGNED NOT NULL,
  `fk_log_status_id` TINYINT UNSIGNED NOT NULL, // статус товара (в корзине, оплачен и т.п.)
  `fk_log_user_id` INT UNSIGNED NOT NULL // пользователь, вносящий изменения (чаще всего - клиент)
  `log_record_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `goods_amount_log_value` VARCHAR(45) NULL,
  `goods_cost_log_value` VARCHAR(45) NULL,
  `goods_discount_log_value` VARCHAR(45) NULL,

  PRIMARY KEY (`log_record_id`),

  CONSTRAINT `fk_log_goods_id`
    FOREIGN KEY (`fk_log_goods_id`)
    REFERENCES `mydb`.`goods` (`goods_id`)
  CONSTRAINT `fk_log_user_id`
    FOREIGN KEY (`fk_log_user_id`)
    REFERENCES `mydb`.`customers` (`user_id`)
  CONSTRAINT `fk_log_status_id`
    FOREIGN KEY (`fk_log_status_id`)
    REFERENCES `mydb`.`goods_status` (`status_id`)
)
 

Надеюсь, не слишком много букв вышло для этого примера..

И нужно бы нам хранить изменения, происходящие в следующих столбцах таблицы goods:
(слева - названия столбцов таблицы goods, справа - столбцов из таблицы goods_history_logger)

`fk_status_id` -> `fk_log_status_id`
`goods_amount` -> `goods_amount_log_value`
`goods_cost` -> `goods_cost_log_value`
`goods_discount` -> `goods_discount_log_value`


при изменении данных в любом из столбцов таблицы goods триггер должен записать в журнальную таблицу изменившееся значение. Измениться может как одно значение (например, цена товара), так сразу и несколько (количество, скидка и статус). Отдельный вопрос в том, можно ли настроить триггер на заполнение только лишь изменившихся столбцов (во избежание хранения лишней информации).

Я так полагаю, нужны будут 3 триггера:

AFTER INSERT - записывающий первичное состояние сразу после создания товара
AFTER UPDATE - записывающий все последующие обновления журналируемых столбцов таблицы
AFTER DELETE - вычищающий все записи по данному товару при его удалении из БД

С первым я , наверное, справился бы. А вот второй трудноват.

CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`goods_AFTER_UPDATE` AFTER UPDATE ON `goods` FOR EACH ROW
BEGIN
...
END

Прошу помощи в составлении триггера № 2 smile

Отредактированно sameuser (24.08.2016 20:37:49)

Неактивен

 

#2 24.08.2016 21:37:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Журналирование на триггерах

sameuser написал:

Отдельный вопрос в том, можно ли настроить триггер на заполнение только лишь изменившихся столбцов (во избежание хранения лишней информации).

можно:

..
IF OLD.`fk_status_id` = NEW.`fk_status_id` THEN insert ...
END IF

IF OLD.`goods_amount` = NEW.`goods_amount` THEN insert ...
END IF
..

Неактивен

 

#3 24.08.2016 21:55:13

sameuser
Участник
Зарегистрирован: 15.08.2016
Сообщений: 6

Re: Журналирование на триггерах

Спасибо за ответ. В таком случае триггер будет производить количество INSERT'ов, равное количеству измененных столбцов? даже если за 1 раз изменилось несколько столбцов?

Неактивен

 

#4 24.08.2016 21:56:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Журналирование на триггерах

да

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson