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