履歴を念頭に置いてデータベースを作成しようとしています (経験から、これをいつか行う必要があることがわかります)。
ここでdatabase-design-how-to-handle-the-archive-problem に質問しましたが、ここのリンクよりも優れた答えはありません。
私の問題は、コードをどこで実行するか、技術的にはどのようにするかです (MySQL は頭痛の種です)。まず、Php でこれを開始しました。挿入を行う前に、レコードを複製して「廃止」としてマークし、レコードを変更します。
ただし、テーブルに付属するすべての依存関係と更新を (何らかの方法で) コーディングすることを意味する依存関係の問題 (manytomany および manytoone の関連付けも更新する必要があります) があります (これは受け入れられません)。
そこで、データベースサーバー側ですべての作業を行うことを考えています。これにより、私の PHP コードが大幅に簡素化されます。
問題は、現在のレコードを変更する前に「アーカイブ」する必要があることです。これを行うには、コードが"before update" トリガー内にある必要があります。
これが私のコードです:
DELIMITER ;;
DROP TRIGGER IF EXISTS produit_trigger_update_before;
CREATE TRIGGER produit_trigger_update_before
BEFORE UPDATE ON produit
FOR EACH ROW BEGIN
/* */
INSERT INTO produit SET
id_origine = OLD.id_origine,
date_v_creation = OLD.date_v_creation,
date_v_start = OLD.date_v_debut,
date_v_end = NOW(),
...
last_record = OLD.last_record;
/* Dependancies : */
SET @last=LAST_INSERT_ID();
UPDATE categorie_produit SET id_produit=@last
WHERE id_produit = OLD.id;
UPDATE produit_attribut SET id_produit=@last
WHERE id_produit = OLD.id;
END;;
DELIMITER ;;
このコードが機能するようになれば、問題はすべて解消されます。しかし、いまいましい、それは機能していません:
mysql> update produit set importance=3;
ERROR 1442 (HY000): Can't update table 'produit' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
mysql> Bye
このページINSTEAD OF UPDATE
には、トリガーで句を使用する実際のサンプルがあります。MySQL はこれをサポートしていないようです。
したがって、私の質問は概念的(=機能する可能性のある他の「原則」がありますか)および/または技術的(=このトリガーを機能させることができますか)の両方です。