class PGTrunk::Operations::Triggers::CreateTrigger

@private

Public Instance Methods

invert() click to toggle source
# File lib/pg_trunk/operations/triggers/create_trigger.rb, line 163
def invert
  irreversible!("replace_existing: true") if replace_existing
  DropTrigger.new(**to_h)
end
to_sql(version) click to toggle source
# File lib/pg_trunk/operations/triggers/create_trigger.rb, line 155
def to_sql(version)
  [
    create_trigger(version),
    *create_comment,
    register_trigger,
  ].join(" ")
end

Private Instance Methods

create_comment() click to toggle source
# File lib/pg_trunk/operations/triggers/create_trigger.rb, line 186
    def create_comment
      return unless comment

      <<~SQL.squish
        COMMENT ON TRIGGER #{name.name.inspect} ON #{table.to_sql}
          IS $comment$#{comment}$comment$;
      SQL
    end
create_trigger(version) click to toggle source
# File lib/pg_trunk/operations/triggers/create_trigger.rb, line 170
def create_trigger(version)
  sql = "CREATE"
  sql << " OR REPLACE" if replace_existing && version >= "14"
  sql << " CONSTRAINT" if constraint
  sql << " TRIGGER #{name.name.inspect}"
  sql << " BEFORE #{events_sql}" if type == :before
  sql << " AFTER #{events_sql}" if type == :after
  sql << " INSTEAD OF #{events_sql}" if type == :instead_of
  sql << " ON #{table.to_sql}"
  sql << " DEFERRABLE" if initially.present?
  sql << " INITIALLY DEFERRED" if initially == :deferred
  sql << " FOR EACH ROW" if for_each&.== :row
  sql << " WHEN (#{self.when})" if self.when.present?
  sql << " EXECUTE PROCEDURE #{function.to_sql(true)};"
end
events_sql() click to toggle source
# File lib/pg_trunk/operations/triggers/create_trigger.rb, line 207
def events_sql
  events.map do |event|
    if event == :update && columns.present?
      "UPDATE OF #{columns.join(', ')}"
    else
      event.to_s.upcase
    end
  end.join(" OR ")
end
register_trigger() click to toggle source
# File lib/pg_trunk/operations/triggers/create_trigger.rb, line 195
    def register_trigger
      <<~SQL.squish
        INSERT INTO pg_trunk (oid, classid)
          SELECT t.oid, 'pg_trigger'::regclass
          FROM pg_trigger t JOIN pg_class c ON t.tgrelid = c.oid
          WHERE c.relname = #{table.quoted}
            AND c.relnamespace = #{table.namespace}
            AND t.tgname = #{name.quoted}
        ON CONFLICT DO NOTHING;
      SQL
    end