diff --git a/spec/lib/gitlab/database/no_cross_db_foreign_keys_spec.rb b/spec/lib/gitlab/database/no_cross_db_foreign_keys_spec.rb index 584320172599f8261aa5089ea9d99f48689f41aa..35674dea0d5432af0a46038c38901a34b379b3e8 100644 --- a/spec/lib/gitlab/database/no_cross_db_foreign_keys_spec.rb +++ b/spec/lib/gitlab/database/no_cross_db_foreign_keys_spec.rb @@ -59,46 +59,24 @@ ).freeze end - def fks_query(table) - <<~SQL - SELECT - tc.constraint_name, - tc.table_name, - kcu.column_name, - ccu.table_name AS foreign_table_name - FROM information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu - ON tc.constraint_name = kcu.constraint_name - AND tc.table_schema = kcu.table_schema - JOIN information_schema.constraint_column_usage AS ccu - ON ccu.constraint_name = tc.constraint_name - AND ccu.table_schema = tc.table_schema - JOIN information_schema.referential_constraints as rc - ON tc.constraint_name = rc.constraint_name - WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name='#{table}'; - SQL + def foreign_keys_for(table_name) + ApplicationRecord.connection.foreign_keys(table_name) end def is_cross_db?(fk_record) - Gitlab::Database::GitlabSchema.table_schemas([fk_record['table_name'], fk_record['foreign_table_name']]).many? + Gitlab::Database::GitlabSchema.table_schemas([fk_record.from_table, fk_record.to_table]).many? end it 'onlies have allowed list of cross-database foreign keys', :aggregate_failures do all_tables = ApplicationRecord.connection.data_sources - cross_db_fks = [] all_tables.each do |table| - ::ApplicationRecord.connection.execute(fks_query(table)).each do |row| - if is_cross_db?(row) - column = "#{row['table_name']}.#{row['column_name']}" - cross_db_fks << column - expect(allowed_cross_database_foreign_keys).to include(column), "Found extra cross-database foreign key #{column} referencing #{row['foreign_table_name']} with constraint name #{row['constraint_name']}. When a foreign key references another database you must use a Loose Foreign Key instead https://docs.gitlab.com/ee/development/database/loose_foreign_keys.html ." + foreign_keys_for(table).each do |fk| + if is_cross_db?(fk) + column = "#{fk.from_table}.#{fk.column}" + expect(allowed_cross_database_foreign_keys).to include(column), "Found extra cross-database foreign key #{column} referencing #{fk.to_table} with constraint name #{fk.name}. When a foreign key references another database you must use a Loose Foreign Key instead https://docs.gitlab.com/ee/development/database/loose_foreign_keys.html ." end end end - - # Ensure that ALLOWED_CROSS_DATABASE_FOREIGN_KEYS does not contain extra - # foreign keys that have since been removed - expect(cross_db_fks).to match_array(allowed_cross_database_foreign_keys) end end