db/migrate/20250507102834_create_trigger_on_project_authorizations.rb (34 lines of code) (raw):

# frozen_string_literal: true class CreateTriggerOnProjectAuthorizations < Gitlab::Database::Migration[2.3] include ::Gitlab::Database::SchemaHelpers milestone '18.0' SRC_TABLE = 'project_authorizations' DEST_TABLE = 'project_authorizations_for_migration' TRIGGER_NAME = 'sync_project_authorizations_to_migration' FUNCTION_NAME = 'sync_project_authorizations_to_migration_table' FUNCTION_BODY = <<~SQL IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN INSERT INTO #{DEST_TABLE} (project_id, user_id, access_level) VALUES (NEW.project_id, NEW.user_id, NEW.access_level::smallint) ON CONFLICT (project_id, user_id) DO UPDATE SET access_level = NEW.access_level::smallint; RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN DELETE FROM #{DEST_TABLE} WHERE project_id = OLD.project_id AND user_id = OLD.user_id; RETURN OLD; END IF; RETURN NULL; SQL def up create_trigger_function(FUNCTION_NAME) { FUNCTION_BODY } create_trigger( SRC_TABLE, TRIGGER_NAME, FUNCTION_NAME, fires: 'AFTER INSERT OR UPDATE OR DELETE') end def down drop_trigger(SRC_TABLE, TRIGGER_NAME) drop_function(FUNCTION_NAME) end end