Более чистый способ записи триггерного журнала при ВСТАВКЕ MySQL

#mysql #database-trigger

#mysql #база данных-триггер

Вопрос:

Я пишу триггер. Цель состоит в том, чтобы зарегистрировать вставку в имени таблицы log :

 CREATE TABLE log (
    id int PRIMARY KEY NOT NULL AUTO_INCREMENT,
    column TINYTEXT,
    value MEDIUMTEXT,
);
  

Моя база данных заполнена несколькими таблицами, такими как client. Я написал триггер для регистрации клиентских данных следующим образом:

 CREATE DEFINER=`root`@`%` TRIGGER `client_after_insert` AFTER INSERT ON `t_client` FOR EACH ROW 
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE CONTINUE HANDLE FOR NOT FOUND SET done = TRUE;

    INSERT INTO log(column, value) VALUES
    ('name', NEW.name),
    ('surname', NEW.surname),
    ('email', NEW.email);
    # etc...
END
  

Вопрос

Есть ли надежный способ перебирать каждый столбец в курсоре, получать colName в
FETCH colCur INTO colName и get NEW.[colName] ?

Целью было бы автоматическое получение нового значения FOR EACH COLUMNS . Таким образом, если мы изменим имя столбца, нам не нужно будет изменять его также в триггере.

Комментарии:

1. Я думаю, что у вас пока нет проблем с вашей логикой. Триггер выполняется один раз за раз. Это зависит только от вашего потока выполнения, вы можете поместить в него хранимую процедуру, если хотите. Для многих возможных случаев.

2. Нет, не без существенного использования подготовленных инструкций. Вам в значительной степени приходится динамически создавать инструкции insert, используя представление information_schema.columns.