#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.