2017-12-19 6 views
0

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を実行してください。しかし、私たちは長い間そのような方法で運用していません。私は、数十回以上の移行を更新する必要があるため、これを行うのは非常に辛いと思います。トリガを私のアプリケーションに徐々に組み込み、開発者/テスト環境を今日のように構築/再作成し続ける方法は、非常に参考になります。

ありがとうございます!

答えて

3

ための負荷あなたはActiveRecordのは理解していないデータベース固有の機能が必要か、必要な場合、あなたはトラックを維持するためdb/structure.sqlに切り替える必要がありますあなたのスキーマのdb/structure.sqlは、データベースのネイティブツールを使用して作成されたスキーマのraw dumpです。そのため、トリガー、CHECK制約、関数結果のインデックスなどが含まれます。

切り替えは簡単です:

  1. アップデートはあなたのconfig/application.rbconfig.active_record.schema_format = :sqlを含むように。
  2. rake db:structure:dumpを入力して、最初にdb/structure.sqlを取得します。
  3. db/schema.rbをディレクトリツリーとリビジョン管理から削除します。
  4. リビジョン管理にdb/structure.sqlを追加します。
  5. あなたの熊手の習慣を調整します。代わりにdb:schema:dump
  6. 利用db:structure:load
    • 使用db:structure:dump代わりdb:schema:load

の他のすべてがそのあなた」、もちろん、と仮定すると(いつものように動作するはずですPostgreSQLを開発、テスト、およびプロダクションに使用する)。

この変更を加えた場合、トリガーはdb/structure.sqlで追跡され、データベースを再作成するとそれらは失われません。

0

gem 'paper_trail'は、監査やバージョン管理のためにモデルに変更を追跡するために使用できます。 Here is the Link

0

https://github.com/jenseng/hair_triggerは必要ありませんか?

トリガーをプロジェクトに登録してから再作成し、コマンドでそれらを更新することができます。

注:私はいつもそれを使いたいと思っていましたが、最終的にさまざまな理由でこれを行う機会がなかったので、宝石の品質を保証することはできません。

EDIT:いいえ、彼らは常にすくいデシベルを使用する必要があります。スキーマ:既存のDB