Задать вопрос
Aleks_ja
@Aleks_ja

MySQL триггер. Возможно ли динамически получить значения OLD и NEW?

Суть задачи — если что-то изменилось в рядке — записать старые и новые значения в другую таблицу (для того чтобы лог вести изменений).

Возможно ли сделать что-то автоматизированное и не хардкодить названия колонок?

Прямо сейчас вот такой код:

CREATE TRIGGER rates_change
    AFTER UPDATE ON duty_rates
     FOR EACH ROW
     BEGIN
     DECLARE done INT default 0;
     DECLARE every_column_name varchar(4000);
     DECLARE cur1 CURSOR FOR select column_name from information_schema.columns where TABLE_SCHEMA='rates_database' and table_name='duty_rates';
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
     OPEN cur1;
     REPEAT
     FETCH cur1 INTO every_column_name;
     IF NOT done THEN
      -- тут иф с проверкой изменилось ли значение  для колонки, название которой every_column_name
	INSERT INTO log_rates_changes -- дальше автоматизировать бы
    END IF;
    UNTIL done END REPEAT;
    CLOSE cur1;
    END;


Т.е. перебираю все колонки, которые есть в структуре, однако к OLD и NEW доступиться никак не получается, и есть подозрение, что не получится.

Пробовал через «PREPARE stmt» — пишет ошибку, что нельзя динамический SQL в триггере выполнять. Если даже в процедуру разместить и вызвать её из триггера — говорят будет тоже самое.
  • Вопрос задан
  • 5013 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
zenon
@zenon
Сам бился над подобным логгером, но, к сожалению, MySQL таких вольностей не позволяет.
Ответ написан
Комментировать
MrMig
@MrMig
Возможно, я не понял сути вашей проблемы, но почему вы не можете использовать алиасы NEW и OLD?

Я использую без проблем следующий триггер в частном случае:
CREATE TRIGGER triggerName 
   AFTER INSERT ON table1 
   FOR EACH ROW 
      INSERT INTO table2 VALUES(NULL, NEW.col1, NEW.col2)
Ответ написан
spacediver
@spacediver
Я бы в скриптах сборки приложения из схемы таблицы генерировал статический последовательный код триггера.
Ответ написан
Ваш ответ на вопрос

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

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