diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index ebea06705..e5643940b 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -14,6 +14,8 @@ def execute(sql, name = nil) raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}" end + materialize_transactions + if id_insert_table_name = query_requires_identity_insert?(sql) with_identity_insert_enabled(id_insert_table_name) { do_execute(sql, name) } else @@ -26,6 +28,8 @@ def exec_query(sql, name = 'SQL', binds = [], prepare: false) raise ActiveRecord::ReadOnlyError, "Write query attempted while in readonly mode: #{sql}" end + materialize_transactions + sp_executesql(sql, name, binds, prepare: prepare) end @@ -136,6 +140,8 @@ def default_insert_value(column) # === SQLServer Specific ======================================== # def execute_procedure(proc_name, *variables) + materialize_transactions + vars = if variables.any? && variables.first.is_a?(Hash) variables.first.map { |k, v| "@#{k} = #{quote(v)}" } else @@ -268,6 +274,8 @@ def set_identity_insert(table_name, enable = true) # === SQLServer Specific (Executing) ============================ # def do_execute(sql, name = 'SQL') + materialize_transactions + log(sql, name) { raw_connection_do(sql) } end diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index 716662851..16b0e9b12 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -145,6 +145,10 @@ def supports_savepoints? true end + def supports_lazy_transactions? + true + end + def supports_in_memory_oltp? @version_year >= 2014 end diff --git a/test/cases/migration_test_sqlserver.rb b/test/cases/migration_test_sqlserver.rb index a687ce6b4..7348bc15b 100644 --- a/test/cases/migration_test_sqlserver.rb +++ b/test/cases/migration_test_sqlserver.rb @@ -45,7 +45,7 @@ class MigrationTestSQLServer < ActiveRecord::TestCase Person.reset_column_information end - it 'not drop the default contraint if just renaming' do + it 'not drop the default constraint if just renaming' do find_default = lambda do connection.execute_procedure(:sp_helpconstraint, 'sst_string_defaults', 'nomsg').select do |row| row['constraint_type'] == "DEFAULT on column string_with_pretend_paren_three"