120列のテーブルがあります。変更された場合に列をログに記録する監査証跡を設定する必要があります。今のところ、すべての列に対して次のような条件でトリガーを設定する必要があると思います。
IF(NEW.columnName != OLD.columnName)
THEN //log the old value
これは 120 回実行する必要があります... 20 年前であればこのアプローチを受け入れていましたが、今日では、変更された列を自動的に見つけるような単純な手順を自動化することは不可能だとは信じていません。
これは私がこれまでに発見したものです:
- NEW も OLD もテーブルではなく、一種の言語構造であるため、「SELECT NOW.*」などを実行することはできません。
- 動的 SQL はトリガーでは許可されていません (これで問題が解決した可能性があります)。
- 動的 SQL を使用する手順は、トリガーでは許可されていません (まじめな話、オラクル、あなたは何があってもこの機能を無効にするために一生懸命働いたようです)。
BEFORE および AFTER トリガーを一時テーブルおよび変数と組み合わせて使用することで問題を解決できる可能性があると考えていましたが、やはり動的 SQL が必要になります。行き止まりにぶつかったような気がします。
これに対する解決策はありますか?
補足質問: これは PostgreSQL で可能でしょうか?
更新:2つの潜在的な解決策を見つけましたが、どちらも十分に明確に見えません: