0

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 の方法が必要です。各列の詳細を手動で指定せずにこれを行う方法はありますか?

4

1 に答える 1

0

各コード ブロックを関数にラップすることもできますが、リファクタリングよりもメイン プロシージャのコードが少なくなることはありません。

IF NEW.TranslatorID <> OLD.TranslatorID THEN
    SET ActionString = CONCAT(ActionString, 'TranslatorID(', OLD.TranslatorID, ' -> ', NEW.TranslatorID, ') ');
END IF;

これに:

SET ActionString = if(NEW.TranslatorID = OLD.TranslatorID, ActionString, CONCAT(ActionString, 'TranslatorID(', OLD.TranslatorID, ' -> ', NEW.TranslatorID, ') '));
于 2012-06-20T13:18:45.530 に答える