From dfb79b2898baf60670fe8c56aa2ff2a63723897c Mon Sep 17 00:00:00 2001 From: Ben McHone Date: Sun, 17 Jan 2021 09:01:43 -0600 Subject: [PATCH 1/2] Updated 'column_definitions_sql' to ensure that only primary key key constraints are queried for --- .../connection_adapters/sqlserver/schema_statements.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb index 521f51ee2..01e4e45b8 100644 --- a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb @@ -472,6 +472,7 @@ def column_definitions_sql(database, identifier) AND c.default_object_id = d.object_id LEFT OUTER JOIN #{database}.sys.key_constraints k ON c.object_id = k.parent_object_id + AND k.type = 'PK' LEFT OUTER JOIN #{database}.sys.index_columns ic ON k.parent_object_id = ic.object_id AND k.unique_index_id = ic.index_id From 42c8e81e4f256e0172456d52a148fd90755d40fc Mon Sep 17 00:00:00 2001 From: Ben McHone Date: Sat, 23 Jan 2021 10:04:07 -0600 Subject: [PATCH 2/2] Added test case for duplicate entries in schema.rb --- test/cases/schema_dumper_test_sqlserver.rb | 6 ++++++ test/schema/sqlserver_specific_schema.rb | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/test/cases/schema_dumper_test_sqlserver.rb b/test/cases/schema_dumper_test_sqlserver.rb index 3a9a3ad8c..4e30dd458 100644 --- a/test/cases/schema_dumper_test_sqlserver.rb +++ b/test/cases/schema_dumper_test_sqlserver.rb @@ -135,6 +135,12 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase assert_line :name, type: "string", limit: nil, default: nil, collation: nil end + it "dumps field with unique key constraints only once" do + output = generate_schema_for_table "unique_key_dumped_table" + + _(output.scan('t.integer "unique_field"').length).must_equal(1) + end + private def generate_schema_for_table(*table_names) diff --git a/test/schema/sqlserver_specific_schema.rb b/test/schema/sqlserver_specific_schema.rb index bae4e4b78..9964cef4f 100644 --- a/test/schema/sqlserver_specific_schema.rb +++ b/test/schema/sqlserver_specific_schema.rb @@ -277,4 +277,14 @@ field_2 int NOT NULL PRIMARY KEY, ) SCHEMATESTMULTIPLESCHEMA + + execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'unique_key_dumped_table') DROP TABLE unique_key_dumped_table" + execute <<-SQLSERVERUNIQUEKEYS + CREATE TABLE unique_key_dumped_table ( + id int IDENTITY(1,1) NOT NULL, + unique_field int DEFAULT 0 NOT NULL, + CONSTRAINT IX_UNIQUE_KEY UNIQUE (unique_field), + CONSTRAINT PK_UNIQUE_KEY PRIMARY KEY (id) + ); + SQLSERVERUNIQUEKEYS end