diff options
Diffstat (limited to 'db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb')
-rw-r--r-- | db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb b/db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb new file mode 100644 index 00000000000..611619e496c --- /dev/null +++ b/db/migrate/20210601080039_group_protected_environments_add_index_and_constraint.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +class GroupProtectedEnvironmentsAddIndexAndConstraint < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + INDEX_NAME = 'index_protected_environments_on_group_id_and_name' + + disable_ddl_transaction! + + def up + add_concurrent_index :protected_environments, [:group_id, :name], unique: true, + name: INDEX_NAME, where: 'group_id IS NOT NULL' + add_concurrent_foreign_key :protected_environments, :namespaces, column: :group_id, on_delete: :cascade + + add_check_constraint :protected_environments, + "((project_id IS NULL) != (group_id IS NULL))", + :protected_environments_project_or_group_existence + end + + def down + remove_group_protected_environments! + + remove_check_constraint :protected_environments, :protected_environments_project_or_group_existence + remove_foreign_key_if_exists :protected_environments, column: :group_id + remove_concurrent_index_by_name :protected_environments, name: INDEX_NAME + end + + private + + def remove_group_protected_environments! + execute <<-SQL + DELETE FROM protected_environments WHERE group_id IS NOT NULL + SQL + end +end |