SO ... Railsの、PostgreSQLの、そして歴史トリガ
execute <<-SQL
CREATE OR REPLACE FUNCTION process_history_table() RETURNS TRIGGER AS $history_table$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO history_table VALUES (DEFAULT, 'D', now(), OLD.*);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO history_table VALUES (DEFAULT, 'U', now(), NEW.*);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO history_table VALUES (DEFAULT, 'I', now(), NEW.*);
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$history_table$ LANGUAGE plpgsql;
CREATE TRIGGER history_table
AFTER INSERT OR UPDATE OR DELETE ON table
FOR EACH ROW EXECUTE PROCEDURE process_history_table();
SQL
私は何かなどを介して私のプロジェクトでは、監査のためのトリガーによって移入履歴テーブルを追加してい
...
...と、この意志生産およびその他の環境のための仕事。問題は、誰かがファイルに保存されていないため、誰かがbundle exec rake db:drop db:create db:schema:load db:migrate RAILS_ENV=test
など(最も重要な部分は
db:schema:load
部分)を実行すると、トリガー作成をバイパスします。
レールを使用する場合、開発者はdb:schema:load
を決して実行しないでください。すべての移行を継続的に再実行できるように常にdb:migrate
を実行してください。しかし、私たちは長い間そのような方法で運用していません。私は、数十回以上の移行を更新する必要があるため、これを行うのは非常に辛いと思います。トリガを私のアプリケーションに徐々に組み込み、開発者/テスト環境を今日のように構築/再作成し続ける方法は、非常に参考になります。
ありがとうございます!