Облачные функции дают хотя бы раз гарантии для выполнения фоновых функций. Это означает, что функция может выполняться несколько раз за одно событие. Хотя это не распространено, это просто способ, которым масштабируемые системы справляются с потенциальными ошибками, когда несколько машин должны координировать и обмениваться данными асинхронно.
Если повторение вызова функции для события проблематично для вашей функции, вам необходимо кодировать свою функцию таким образом, чтобы она была идемпотентной. Вы можете посмотреть это видео , чтобы немного больше понять, и прочитать документацию .
Общую проблему, которую нельзя избежать, называют проблемой Two Generals в информатике. Вы можете прочитать об этом, чтобы лучше понять большую проблему. По сути, все компьютерные системы, в которых работают облачные функции, не могут на 100% надежно постоянно общаться друг с другом (из-за ошибок и потери данных), поэтому повторные попытки необходимы для обеспечения выполнения функции хотя бы раз, что лучше чем никогда.
Синтаксис вставки:
INSERT INTO table (columns_list) VALUES (values_list)
, поэтому ваша вставка будет выглядеть примерно так (я не эксперт по MySQL, но вы можете соответствовать запросу):
INSERT INTO data_tracking
(`data_id` , `field` , `old_value` , `new_value` , `modified` )
VALUES
(NEW.data_id, 'field1', OLD.field, NEW.field, CURRENT_DATETIME());
И повторите его для изменения field2 и field3
Я думаю, это будет полный триггер, попробуйте:
DELIMITER $$
DROP TRIGGER `update_data `$$
CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
IF (NEW.field1 != OLD.field1) THEN
INSERT INTO data_tracking
(`data_id` , `field` , `old_value` , `new_value` , `modified` )
VALUES
(NEW.data_id, "field1", OLD.field1, NEW.field1, NOW());
END IF;
IF (NEW.field2 != OLD.field2) THEN
INSERT INTO data_tracking
(`data_id` , `field` , `old_value` , `new_value` , `modified` )
VALUES
(NEW.data_id, "field2", OLD.field2, NEW.field2, NOW());
END IF;
IF (NEW.field3 != OLD.field3) THEN
INSERT INTO data_tracking
(`data_id` , `field` , `old_value` , `new_value` , `modified` )
VALUES
(NEW.data_id, "field3", OLD.field3, NEW.field3, NOW());
END IF;
END$$
DELIMITER ;