Skip to content

SchemaPlus/schema_plus_triggers

Repository files navigation

Gem Version Build Status Coverage Status

SchemaPlus::Triggers

ScemaPlus::Triggers adds support for SQL triggers in ActiveRecord.

SchemaPlus::Triggers is part of the SchemaPlus family of Ruby on Rails ActiveRecord extension gems.

Installation

As usual:

gem "schema_plus_triggers"                # in a Gemfile
gem.add_dependency "schema_plus_triggers" # in a .gemspec

Compatibility

SchemaPlus::Triggers is tested on:

  • ruby 2.5 with activerecord 5.2, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 2.5 with activerecord 6.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 2.5 with activerecord 6.1, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 2.7 with activerecord 5.2, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 2.7 with activerecord 6.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 2.7 with activerecord 6.1, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 2.7 with activerecord 7.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 3.0 with activerecord 6.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 3.0 with activerecord 6.1, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 3.0 with activerecord 7.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 3.1 with activerecord 6.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 3.1 with activerecord 6.1, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12
  • ruby 3.1 with activerecord 7.0, using postgresql:9.6, postgresql:10, postgresql:11 or postgresql:12

Usage

Note for PostgreSQL

You will need to also add the schema_plus_functions gem and define your trigger function.

create_function :my_trigger_func, '', <<-END
RETURNS trigger
  LANGUAGE plpgsql
  AS $$
BEGIN
  BEGIN
    IF (TG_OP = 'DELETE') THEN
      INSERT INTO log (operation, log) VALUES ('DELETE', OLD.name);
    ELSEIF (TG_OP = 'UPDATE') THEN
      INSERT INTO log (operation, log) VALUES ('UPDATE', OLD.name || ' to ' || NEW.name);
    ELSEIF (TG_OP = 'INSERT') THEN
      INSERT INTO log (operation, log) VALUES ('INSERT', NEW.name);
    END IF; 
  END;
END;
$$
END

Migrations

To declare a trigger use create_trigger:

create_trigger :my_table, :my_trigger, 'after insert', 'for each row execute procedure my_trigger_func()' 

To drop a trigger use drop_trigger:

drop_trigger :my_table, :my_trigger

Introspection

You can query the list of triggers defined at the connection level (uncached):

connection.triggers

This will return an array of arrays. The inner array containing the table name and the trigger name.

History

  • 1.0.1 - Add AR 6.1 and 7.0, as well as Ruby 3.1 support
  • 1.0.0 - Drop ruby < 2.5, and add Rails 6.0
  • 0.2.0 - Add testing for multiple PostgreSQL versions
  • 0.1.0 - Initial release

Development & Testing

Are you interested in contributing to SchemaPlus::Triggers? Thanks! Please follow the standard protocol: fork, feature branch, develop, push, and issue pull request.

Some things to know about to help you develop and test:

  • schema_dev: SchemaPlus::Triggers uses schema_dev to facilitate running rspec tests on the matrix of ruby, activerecord, and database versions that the gem supports, both locally and on github actions

    To to run rspec locally on the full matrix, do:

      $ schema_dev bundle install
      $ schema_dev rspec
    

    You can also run on just one configuration at a time; For info, see schema_dev --help or the schema_dev README.

    The matrix of configurations is specified in schema_dev.yml in the project root.

  • schema_plus_core: SchemaPlus::Triggers uses the SchemaPlus::Core API that provides middleware callback stacks to make it easy to extend ActiveRecord's behavior. If that API is missing something you need for your contribution, please head over to schema_plus_core and open an issue or pull request.
  • schema_monkey: SchemaPlus::Triggers is implemented as a schema_monkey client, using schema_monkey's convention-based protocols for extending ActiveRecord and using middleware stacks.

About

SchemaPlus gem adding support for SQL Triggers

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages