Translation テーブルがあり、それに対するすべての更新が自動的に TranslationHistory テーブルに記録されるようにしたいと考えています。
そのためにこのトリガーを作成しました。
CREATE TRIGGER TranslationUpdate AFTER UPDATE ON Translation FOR EACH ROW BEGIN
DECLARE N DATETIME;
DECLARE ActionString VARCHAR(1000);
SET N = now();
SET ActionString = '';
IF NEW.TranslatorID <> OLD.TranslatorID THEN
SET ActionString = CONCAT(ActionString, 'TranslatorID(', OLD.TranslatorID, ' -> ', NEW.TranslatorID, ') ');
END IF;
IF NEW.StartDate <> OLD.StartDate THEN
SET ActionString = CONCAT(ActionString, 'StartDate(', OLD.StartDate, ' -> ', NEW.StartDate, ') ');
END IF;
IF NEW.DueDate <> OLD.DueDate THEN
SET ActionString = CONCAT(ActionString, 'DueDate(', OLD.DueDate, ' -> ', NEW.DueDate, ') ');
END IF;
IF NEW.EndDate <> OLD.EndDate THEN
SET ActionString = CONCAT(ActionString, 'EndDate(', OLD.EndDate, ' -> ', NEW.EndDate, ') ');
END IF;
IF NEW.Notes <> OLD.Notes THEN
SET ActionString = CONCAT(ActionString, 'Notes(', OLD.Notes, ' -> ', NEW.Notes, ') ');
END IF;
INSERT INTO TranslationHistory (TranslationID, Date, Action)
VALUES (NEW.ID, N, ActionString);
END;
とても長く、退屈で、繰り返しが多いので、私はあまり好きではありません。そして、それは良い SQL ではないと確信しています。これを行うには、DRYer の方法が必要です。各列の詳細を手動で指定せずにこれを行う方法はありますか?