SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 16.02.2017 21:59:49

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 97

Как сделать триггер update, чтобы он прописывал в журнал "имя таблицы" и "поле"?

Используется
MySQL - 5.7 - х64

Основная таблица 1

CREATE TABLE `trg_02_1_test` (
    `id_tbl_02_1` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `cur_datetime_tbl_02_1` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `pol_1_date_tbl_02_1` DATE NULL DEFAULT NULL,
    `pol_2_enum_tbl_02_1` ENUM('Y','N') NULL DEFAULT NULL,
    `pol_3_longtxt_tbl_02_1` LONGTEXT NULL,
    `pol_4_txt_tbl_02_1` TEXT NULL,
    `pol_5_int_tbl_02_1` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`id_tbl_02_1`)
)
LONGTEXT\r\n'
COLLATE='
utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=7
;



Таблица журнала
CREATE TABLE `trg` (
    `datetime_log` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `tbl_02_name_log` TEXT NULL,
    `id_tbl_02_n_log` INT(11) NULL DEFAULT NULL,
    `tbl_02_pol_name_log` TEXT NULL,
    `tbl_02_pol_content_log` TEXT NULL
)
LONGTEXT\r\n'
COLLATE='
utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DYNAMIC
;


Триггер для журналирования
CREATE DEFINER=`root`@`%` TRIGGER `trg_02_1_test_before_update` BEFORE UPDATE ON `trg_02_1_test` FOR EACH ROW BEGIN
INSERT INTO trglog
     Set
     id_tbl_02_n_log = NEW.id_tbl_02_1,
     tbl_02_pol_content_log = NEW.pol_4_txt_tbl_02_1;
 
END


Предполагается в журнал помещать данные из нескольких таблиц.

Вопрос.
Как сделать, чтобы в журнал
- в поле `tbl_02_name_log` - подставлялось наименование таблицы в которой происходит обновление;
- в поле `tbl_02_pol_name_log` - подставлялось наименование поля в которой происходит обновление;
?

Отредактированно sql157 (16.02.2017 22:00:57)

Неактивен

 

#2 16.02.2017 22:12:13

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

Re: Как сделать триггер update, чтобы он прописывал в журнал "имя таблицы" и "поле"?

1. `tbl_02_name_log`='trg_02_1_test'
2. для каждого поля в триггере проверяте, if new.`col_name`<>old.`col_name` then insert into trglog

Неактивен

 

#3 17.02.2017 11:46:16

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 97

Re: Как сделать триггер update, чтобы он прописывал в журнал "имя таблицы" и "поле"?

vasya написал:

1. `tbl_02_name_log`='trg_02_1_test'
2. для каждого поля в триггере проверяте, if new.`col_name`<>old.`col_name` then insert into trglog

Попробовал для одного поля создать...
Выдаёт  ошибку синтаксиса - 1064
см. скрин http://prntscr.com/e9tg13


delimiter//
CREATE TRIGGER `trg_02_1_test_before_update` BEFORE UPDATE ON `trg_02_1_test` FOR EACH ROW
 BEGIN
   /* поле pol_4_txt_tbl_02_1 */
  IF ( NOT OLD.pol_4_txt_tbl_02_1 <=> NEW.pol_4_txt_tbl_02_1)
       THEN  
  INSERT INTO trglog
     Set    
     id_tbl_02_n_log = NEW.id_tbl_02_1,
    tbl_02_pol_content_log = NEW.pol_4_txt_tbl_02_1,
     tbl_02_pol_name_log = 'pol_4_txt_tbl_02_1';
    END IF;    
    tbl_02_name_log = 'trg_02_1_test';

END//
 


Вопрос.
В чём может быть проблема?

Отредактированно sql157 (17.02.2017 12:39:45)

Неактивен

 

#4 17.02.2017 12:56:32

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

Re: Как сделать триггер update, чтобы он прописывал в журнал "имя таблицы" и "поле"?

1. в том же что и раньше, в hedisql
2. знак неравенства это <>

Неактивен

 

#5 17.02.2017 18:44:42

sql157
Завсегдатай
Зарегистрирован: 17.03.2016
Сообщений: 97

Re: Как сделать триггер update, чтобы он прописывал в журнал "имя таблицы" и "поле"?

Решение вопроса


CREATE DEFINER=`root`@`%` TRIGGER `trg_02_1_test_before_update` BEFORE UPDATE ON `trg_02_1_test` FOR EACH ROW BEGIN
/*РАБОТАЕТ ДАТА*/
  IF (NOT OLD.pol_1_date_tbl_02_1 <=> NEW.pol_1_date_tbl_02_1)
    THEN  
    INSERT INTO trg_02_00_log(tbl_02_tbl_name_log, id_tbl_02_n_log, tbl_02_pol_name_log, tbl_02_pol_content_log)  
    VALUES('trg_02_1_test', NEW.id_tbl_02_1, 'pol_1_date_tbl_02_1' ,NEW.pol_1_date_tbl_02_1);
  END IF;
 
      /*РАБОТАЕТ enum*/
  IF (NOT OLD.pol_2_enum_tbl_02_1 <=> NEW.pol_2_enum_tbl_02_1)
    THEN  
    INSERT INTO trg_02_00_log(tbl_02_tbl_name_log, id_tbl_02_n_log, tbl_02_pol_name_log, tbl_02_pol_content_log)  
    VALUES('trg_02_1_test', NEW.id_tbl_02_1, 'tbl_02_pol_name_log' ,NEW.pol_2_enum_tbl_02_1);
  END IF;
 
      /*РАБОТАЕТ longtxt*/
  IF (NOT OLD.pol_3_longtxt_tbl_02_1 <=> NEW.pol_3_longtxt_tbl_02_1)
    THEN  
    INSERT INTO trg_02_00_log(tbl_02_tbl_name_log, id_tbl_02_n_log, tbl_02_pol_name_log, tbl_02_pol_content_log)  
    VALUES('trg_02_1_test', NEW.id_tbl_02_1, 'pol_3_longtxt_tbl_02_1' ,NEW.pol_3_longtxt_tbl_02_1);
  END IF;

    /*РАБОТАЕТ ТЕКСТ*/
    IF (NOT OLD.pol_4_txt_tbl_02_1 <=> NEW.pol_4_txt_tbl_02_1)
    THEN  
    INSERT INTO trg_02_00_log(tbl_02_tbl_name_log, id_tbl_02_n_log, tbl_02_pol_name_log, tbl_02_pol_content_log)  
    VALUES('trg_02_1_test', NEW.id_tbl_02_1, 'pol_4_txt_tbl_02_1' ,NEW.pol_4_txt_tbl_02_1);
  END IF;

      /*РАБОТАЕТ int*/
  IF (NOT OLD.pol_5_int_tbl_02_1 <=> NEW.pol_5_int_tbl_02_1)
    THEN  
    INSERT INTO trg_02_00_log(tbl_02_tbl_name_log, id_tbl_02_n_log, tbl_02_pol_name_log, tbl_02_pol_content_log)  
    VALUES('trg_02_1_test', NEW.id_tbl_02_1, 'pol_5_int_tbl_02_1' ,NEW.pol_5_int_tbl_02_1);
  END IF;

END
 

Неактивен

 

Board footer

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