テーブルで発生するすべての変更を追跡するトリガーを作成しています。残念ながら、テーブルには150以上の列があり、コードに各列を書くのを避けたかったので(例:new.col1、new.col2 ....)、「更新後トリガー」に次のクエリを書きました
INSERT INTO logs SELECT *, NOW() FROM abc WHERE abc.id = NEW.Id;
この考えは、更新クエリで変更されていないデータの重複により、複数の問題を引き起こしています。
一言で言えば、どの列が更新クエリの一部であったかを動的に見つけたいのですが、それが不可能な場合は、「新しい」行のすべての列を反復処理して、old.@colName == new を動的に比較できるようにする方法があります。 .@colName?
Oracle PL/SQL: Loop Over Trigger Columns Dynamically、t-sql の更新トリガーで何かが変更されたかどうかを判断する方法、およびMySQL UPDATE トリガー: 実際に変更された列の値を INSERTing を見ました 。
最後のリンクは、1 つの違いだけで必要なものに近いものです。同様のトリガーを作成するすべてのテーブルに 100 以上の列があるため、次のステートメントで列名をハードコーディングしたくありません!!
IF NEW.column1 <> OLD.column1 THEN INSERT INTO... END IF; IF NEW.column2 <> OLD.column2 THEN INSERT INTO... END IF