diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index 6dbed485e..82f32a690 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -189,7 +189,7 @@ def reset! def tables_with_referential_integrity schemas_and_tables = select_rows <<-SQL.strip_heredoc - SELECT s.name, o.name + SELECT DISTINCT s.name, o.name FROM sys.foreign_keys i INNER JOIN sys.objects o ON i.parent_object_id = o.OBJECT_ID INNER JOIN sys.schemas s ON o.schema_id = s.schema_id diff --git a/test/cases/adapter_test_sqlserver.rb b/test/cases/adapter_test_sqlserver.rb index 1b7b46635..16cb96b97 100644 --- a/test/cases/adapter_test_sqlserver.rb +++ b/test/cases/adapter_test_sqlserver.rb @@ -231,6 +231,11 @@ class AdapterTestSQLServer < ActiveRecord::TestCase end end + it 'not disable referential integrity for the same table twice' do + tables = SSTestHasPk.connection.tables_with_referential_integrity + assert_equal tables.size, tables.uniq.size + end + end describe 'database statements' do diff --git a/test/schema/sqlserver_specific_schema.rb b/test/schema/sqlserver_specific_schema.rb index 52329387f..00fef941e 100644 --- a/test/schema/sqlserver_specific_schema.rb +++ b/test/schema/sqlserver_specific_schema.rb @@ -144,12 +144,20 @@ # Constraints - create_table(:sst_has_fks, force: true) { |t| t.column(:fk_id, :bigint, null: false) } + create_table(:sst_has_fks, force: true) do |t| + t.column(:fk_id, :bigint, null: false) + t.column(:fk_id2, :bigint) + end + create_table(:sst_has_pks, force: true) { } execute <<-ADDFKSQL ALTER TABLE sst_has_fks ADD CONSTRAINT FK__sst_has_fks_id FOREIGN KEY ([fk_id]) + REFERENCES [sst_has_pks] ([id]), + + CONSTRAINT FK__sst_has_fks_id2 + FOREIGN KEY ([fk_id2]) REFERENCES [sst_has_pks] ([id]) ADDFKSQL