diff --git a/db/post_migrate/20250926213835_backfill_design_management_designs_sync.rb b/db/post_migrate/20250926213835_backfill_design_management_designs_sync.rb new file mode 100644 index 0000000000000000000000000000000000000000..731ecebfc718dae4c1298f7b6d57e2f719c65adb --- /dev/null +++ b/db/post_migrate/20250926213835_backfill_design_management_designs_sync.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +class BackfillDesignManagementDesignsSync < Gitlab::Database::Migration[2.3] + disable_ddl_transaction! + milestone '18.5' + restrict_gitlab_migration gitlab_schema: :gitlab_main + + def up + each_batch(:design_management_designs, of: 100) do |sub_batch| + sub_batch_ids = sub_batch.select(:id) + update_design_management_designs_namespace_id!(sub_batch_ids) + + # Since the design_management_designs table now has the correct namespace_id, we can now update the values on + # the child tables (design_management_designs_versions and design_user_mentions) + update_design_management_designs_versions_namespace_id!(sub_batch_ids) + update_design_user_mentions_namespace_id!(sub_batch_ids) + end + end + + def down + # no-op + end + + private + + # Sets the namespace_id on design_management_designs to the corresponding project's project_namespace_id + def update_design_management_designs_namespace_id!(sub_batch_ids) + sql = <<~SQL + UPDATE design_management_designs + SET namespace_id = p.project_namespace_id + FROM projects p + WHERE design_management_designs.project_id = p.id + AND design_management_designs.id IN (#{sub_batch_ids.to_sql}) + SQL + + ApplicationRecord.connection.execute(sql) + end + + # Sets the namespace_id on design_management_designs_versions to the corresponding design_management_designs's + # namespace_id + def update_design_management_designs_versions_namespace_id!(sub_batch_ids) + sql = <<~SQL + UPDATE design_management_designs_versions + SET namespace_id = design_management_designs.namespace_id + FROM design_management_designs + WHERE design_management_designs.id = design_management_designs_versions.design_id + AND design_management_designs_versions.design_id IN (#{sub_batch_ids.to_sql}) + SQL + + ApplicationRecord.connection.execute(sql) + end + + # Sets the namespace_id on design_user_mentions to the corresponding design_management_designs's namespace_id + def update_design_user_mentions_namespace_id!(sub_batch_ids) + sql = <<~SQL + UPDATE design_user_mentions + SET namespace_id = design_management_designs.namespace_id + FROM design_management_designs + WHERE design_management_designs.id = design_user_mentions.design_id + AND design_user_mentions.design_id IN (#{sub_batch_ids.to_sql}) + SQL + + ApplicationRecord.connection.execute(sql) + end +end diff --git a/db/schema_migrations/20250926213835 b/db/schema_migrations/20250926213835 new file mode 100644 index 0000000000000000000000000000000000000000..2ae23c752665903f068b6e08245a507b3bf521e2 --- /dev/null +++ b/db/schema_migrations/20250926213835 @@ -0,0 +1 @@ +fa364993482b54ccc6c77f681e5849cfcafa78dae20affc3f68826e7a00f2f0e \ No newline at end of file