Fix Error 500s when attempting to destroy a protected tag
Due to a missing `on_delete: :cascade`, users would hit the error that looked like: ``` PG::ForeignKeyViolation: ERROR: update or delete on table "protected_tags" violates foreign key constraint "fk_rails_f7dfda8c51" on table "protected_tag_create_access_levels" DETAIL: Key (id)=(1385) is still referenced from table "protected_tag_create_access_levels". : DELETE FROM "protected_tags" WHERE "protected_tags"."id" = 1385 ``` Closes #36013
This commit is contained in:
parent
84336b848c
commit
718ecd4eb5
|
|
@ -0,0 +1,35 @@
|
|||
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
|
||||
# for more information on how to write migrations for GitLab.
|
||||
|
||||
class CorrectProtectedTagsForeignKeys < ActiveRecord::Migration
|
||||
include Gitlab::Database::MigrationHelpers
|
||||
|
||||
# Set this constant to true if this migration requires downtime.
|
||||
DOWNTIME = false
|
||||
|
||||
disable_ddl_transaction!
|
||||
|
||||
def up
|
||||
remove_foreign_key_without_error(:protected_tag_create_access_levels,
|
||||
column: :protected_tag_id)
|
||||
|
||||
execute <<-EOF
|
||||
DELETE FROM protected_tag_create_access_levels
|
||||
WHERE NOT EXISTS (
|
||||
SELECT true
|
||||
FROM protected_tags
|
||||
WHERE protected_tag_create_access_levels.protected_tag_id = protected_tags.id
|
||||
)
|
||||
AND protected_tag_id IS NOT NULL
|
||||
EOF
|
||||
|
||||
add_concurrent_foreign_key(:protected_tag_create_access_levels,
|
||||
:protected_tags,
|
||||
column: :protected_tag_id)
|
||||
end
|
||||
|
||||
def down
|
||||
# Previously there was a foreign key without a CASCADING DELETE, so we'll
|
||||
# just leave the foreign key in place.
|
||||
end
|
||||
end
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20170815060945) do
|
||||
ActiveRecord::Schema.define(version: 20170820100558) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
|
@ -1726,7 +1726,7 @@ ActiveRecord::Schema.define(version: 20170815060945) do
|
|||
add_foreign_key "protected_branch_push_access_levels", "protected_branches", name: "fk_9ffc86a3d9", on_delete: :cascade
|
||||
add_foreign_key "protected_branches", "projects", name: "fk_7a9c6d93e7", on_delete: :cascade
|
||||
add_foreign_key "protected_tag_create_access_levels", "namespaces", column: "group_id"
|
||||
add_foreign_key "protected_tag_create_access_levels", "protected_tags"
|
||||
add_foreign_key "protected_tag_create_access_levels", "protected_tags", name: "fk_f7dfda8c51", on_delete: :cascade
|
||||
add_foreign_key "protected_tag_create_access_levels", "users"
|
||||
add_foreign_key "protected_tags", "projects", name: "fk_8e4af87648", on_delete: :cascade
|
||||
add_foreign_key "push_event_payloads", "events_for_migration", column: "event_id", name: "fk_36c74129da", on_delete: :cascade
|
||||
|
|
|
|||
|
|
@ -606,6 +606,11 @@ module Gitlab
|
|||
Arel::Nodes::SqlLiteral.new(replace.to_sql)
|
||||
end
|
||||
end
|
||||
|
||||
def remove_foreign_key_without_error(*args)
|
||||
remove_foreign_key(*args)
|
||||
rescue ArgumentError
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue