Rails 3.1.3 アプリにはsubscriptions
テーブルがあります。このテーブルでの操作は追跡する必要があり、これは請求にとって重要です。データベースにはさまざまな方法 (API、コンソール、クライアント アプリ) でアクセスできるため、単純な ActiveRecord コールバックまたはオブザーバーでは、テーブル上のすべてのトランザクションが記録されていることを確認するのに十分ではありません。したがって、subscriptions
何かが変更されるたびに「ログ」テーブルにレコードを挿入するテーブルにデータベーストリガーを作成します。そのために、Rails マイグレーションを次のように使用しています。
def up
execute <<-SQL
CREATE OR REPLACE FUNCTION FUNCTION_Event_Type()
RETURNS TRIGGER
AS
$TRIGGER_Event_Type$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO subscription_log (company_id, product_id, old_package_id, new_package_id, trigger_type, updated_at, created_at)
SELECT OLD.company_id, OLD.product_id, OLD.package_id, NULL, 'Delete', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO subscription_log (company_id, product_id, old_package_id, new_package_id, trigger_type, updated_at, created_at)
SELECT OLD.company_id, OLD.product_id, OLD.package_id, NEW.package_id, 'Update', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO subscription_log (company_id, product_id, old_package_id, new_package_id, trigger_type, updated_at, created_at)
SELECT NEW.company_id, NEW.product_id, NULL, NEW.package_id, 'Insert', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP;
RETURN NEW;
END IF;
RETURN NULL;
END;
$TRIGGER_Event_Type$
LANGUAGE plpgsql;
CREATE TRIGGER TRIGGER_Event_Type
AFTER INSERT OR UPDATE OR DELETE ON subscriptions
FOR EACH ROW EXECUTE PROCEDURE FUNCTION_Event_Type();
SQL
end
トリガーは正常に機能し、必要に応じてログに記録します。テーブルで何かが行われるたびに、レコードが「ロギング」テーブルに挿入されることを確認するrspecテストがありsubscriptions
ます。ただし、アプリの作業を続け、subscriptions
Rails 移行を使用してテーブルに列を追加する必要がありました。
def change
add_column :subscriptions, :description, :text
end
移行を実行した後、トリガー機能を確認するテストは次のようになります。
lambda do
FactoryGirl.create(:subscription)
end.should change(SubscriptionLog, :count).by(1)
失敗し始めました。
UPDATE : 開発データベースには、列を追加した後もまだトリガーがあります。テストデータベースは、列を追加する移行を実行した後にトリガーを失います...奇妙な
質問:
テーブルを変更するとトリガーが強制終了されますか? もしそうなら、トリガーが持続することを確認する方法は何ですか?