diff --git a/lib/active_record/connection_adapters/sqlserver_adapter.rb b/lib/active_record/connection_adapters/sqlserver_adapter.rb index da8fd8411..666f91047 100644 --- a/lib/active_record/connection_adapters/sqlserver_adapter.rb +++ b/lib/active_record/connection_adapters/sqlserver_adapter.rb @@ -483,7 +483,8 @@ def type_map def translate_exception(exception, message:, sql:, binds:) case message - when /(SQL Server client is not connected)|(failed to execute statement)|(failed dbsqlsend)/i + when /(SQL Server client is not connected)|(failed to execute statement)|(failed dbsqlsend)/i, + /(DBPROCESS is dead or not enabled)/i ConnectionNotEstablished.new(message, connection_pool: @pool) when /(cannot insert duplicate key .* with unique index) | (violation of (unique|primary) key constraint)/i RecordNotUnique.new(message, sql: sql, binds: binds, connection_pool: @pool) diff --git a/test/cases/adapter_test_sqlserver.rb b/test/cases/adapter_test_sqlserver.rb index 4fff78dff..610b361e5 100644 --- a/test/cases/adapter_test_sqlserver.rb +++ b/test/cases/adapter_test_sqlserver.rb @@ -41,6 +41,14 @@ class AdapterTestSQLServer < ActiveRecord::TestCase assert_raise(ActiveRecord::StatementInvalid) { Topic.lease_connection.update("UPDATE XXX") } end + it "translates a dead DBPROCESS TinyTds error into a connection not established error" do + exception = TinyTds::Error.new("DBPROCESS is dead or not enabled") + translated = connection.send( + :translate_exception, exception, message: exception.message, sql: "SELECT 1", binds: [] + ) + assert_kind_of ActiveRecord::ConnectionNotEstablished, translated + end + it "is has our adapter_name" do assert_equal "SQLServer", connection.adapter_name end