MySQL Trigger, который сравнивает все OLD и NEW для изменений, должен быть упрощен - PullRequest
3 голосов
/ 13 декабря 2011

Я хочу, чтобы мои триггеры «аудита» были проще в обслуживании.На самом деле, для триггера «До обновления» логика выглядит следующим образом:

IF NEW.field <> OLD.field THEN INSERT INTO table SET field=OLD.field

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

Существует ли простой способ прохождения каждого столбца, подобный этому:

FOR EACH COL BEGIN IF NEW.COL <> OLD.COL THEN SET changedetected=true; END IF; END

И после этого, используя цикл FOR таким же образом, чтобы заполнить таблицу Audit всеми столбцами таблицы?

Я не знаю, достаточно ли я ясен,пожалуйста, оставляйте комментарии, если это необходимо.

Большое спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 27 ноября 2012

Вы не можете использовать подготовленные операторы в триггерах MySQL.

0 голосов
/ 20 июля 2012

Вы можете получить список столбцов от

SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
ORDER BY ordinal_position;

тогда вы можете просто обернуть запрос в CURSOR и просмотреть имена.

Для сравнения, я полагаю, вы могли бы PREPARE заявление для него

SET @s = CONCAT('SELECT OLD.', col_name, ' = NEW.', col_name, ' INTO @cmp');
PREPARE stmt FROM @s;
EXECUTE stmt;
IF @cmp ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...