Rails, PostgreSQL y disparadores de historial

ENTONCES...

Estoy agregando tablas de historial pobladas por disparadores para auditar en mi proyecto a través de algo como ...

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

... y esto funcionará para la producción y otros entornos. El problema es cuando alguien correbundle exec rake db:drop db:create db:schema:load db:migrate RAILS_ENV=test o algo similar (lo más importante es eldb:schema:load parte), esto evitará la creación de activadores ya que los activadores no se guardan endb/schema.rb archivo.

Quizás la solución correcta sea decir que cuando se usan rieles, los desarrolladores nunca deberían ejecutardb:schema:load y siempre corredb:migrate en su lugar, para garantizar que todas las migraciones se puedan volver a ejecutar continuamente. Sin embargo, no hemos estado operando de esa manera durante mucho tiempo y creo que sería muy doloroso hacerlo, ya que podríamos necesitar actualizar varias docenas o más migraciones. Cualquier idea sobre cómo podría incorporar disparadores en mi aplicación de forma incremental y hacer que los entornos de desarrollador / prueba continúen siendo construidos / recreados de la misma manera que hoy sería muy útil.

¡Gracias!

Respuestas a la pregunta(3)

Su respuesta a la pregunta