7

120列のテーブルがあります。変更された場合に列をログに記録する監査証跡を設定する必要があります。今のところ、すべての列に対して次のような条件でトリガーを設定する必要があると思います。

IF(NEW.columnName != OLD.columnName)
THEN //log the old value

これは 120 回実行する必要があります... 20 年前であればこのアプローチを受け入れていましたが、今日では、変更された列を自動的に見つけるような単純な手順を自動化することは不可能だとは信じていません。

これは私がこれまでに発見したものです:

  • NEW も OLD もテーブルではなく、一種の言語構造であるため、「SELECT NOW.*」などを実行することはできません。
  • 動的 SQL はトリガーでは許可されていません (これで問題が解決した可能性があります)。
  • 動的 SQL を使用する手順は、トリガーでは許可されていません (まじめな話、オラクル、あなたは何があってもこの機能を無効にするために一生懸命働いたようです)。

BEFORE および AFTER トリガーを一時テーブルおよび変数と組み合わせて使用​​することで問題を解決できる可能性があると考えていましたが、やはり動的 SQL が必要になります。行き止まりにぶつかったような気がします。

これに対する解決策はありますか?

補足質問: これは PostgreSQL で可能でしょうか?

更新:2つの潜在的な解決策を見つけましたが、どちらも十分に明確に見えません:

  • 回避策として EVENTS を使用して、動的 SQL回避策と組み合わせてトリガーを使用します。認めざるを得ませんが、これはよくわかりません。これは、EVENTが何があっても毎秒発生するということですか?
  • この記事では、一時テーブルが使用されている限り、トリガー内で動的 SQL を使用することが可能であると述べています。それはまだ動的SQLを使用しているため、よくわかりません。
4

2 に答える 2

1

興味深いことに、動的トリガーベースの監査ログを実装することで、数年前に同じ問題に直面していました。私が思いついた解決策は、古いトリガー定義を置き換えるために (自動的に) 適用できる SQL トリガー コードを単純に生成することでした。メモリが機能する場合、PHP スクリプトによって処理されるいくつかの SQL テンプレートを作成しました。PHP スクリプトは、「SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE ...」に基づいて完全なトリガー定義を出力していました。はい、トリガー コードは巨大でしたが、機能しました。少し役立つことを願っています=)

于 2013-02-06T01:22:28.483 に答える