Проблема с миграцией базы данных Azure для приложения Ruby - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть работающее приложение Ruby on Rails (работающее на Ruby 2.2.10p489 и Rails 4.2.5 и activerecord-sqlserver-adapter 4.2.6) на сервере Linux (Amazon AMI v 2018.03 rhel fedora). Он подключается к базе данных Azure. Все отлично работаетНо когда я выполняю миграцию в другую базу данных Azure и изменяю учетные данные, чтобы они указывали на новую базу данных, я получаю длинный список бесполезных ошибок, который выглядит примерно так:

SystemStackError: stack level too deep
        from /apps/acme_dynamite/path/ruby/2.2/gems/tiny_tds-1.0.5/lib/tiny_tds/client.rb:53:in `connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/tiny_tds-1.0.5/lib/tiny_tds/client.rb:53:in `initialize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:280:in `new'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:280:in `dblib_connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:271:in `connect'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/connection_adapters/sqlserver_adapter.rb:59:in `initialize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/sqlserver_base.rb:18:in `new'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-sqlserver-adapter-4.2.6/lib/active_record/sqlserver_base.rb:18:in `sqlserver_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
        from /usr/share/ruby/2.2/monitor.rb:211:in `mon_synchronize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
        from /usr/share/ruby/2.2/monitor.rb:211:in `mon_synchronize'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
        from /apps/acme_dynamite/path/ruby/2.2/gems/activerecord-4.2.5/lib/active_record/connection_handling.rb:87:in `connection'
        from (irb):1
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/console.rb:110:in `start'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/console.rb:9:in `start'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:68:in `console'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /apps/acme_dynamite/path/ruby/2.2/gems/railties-4.2.5/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'

рабочее соединение Azure выглядит примерно так:

env PRODUCTION_DATABASE_HOST="xxx.database.windows.net"
env PRODUCTION_DATABASE_PORT=1433
env PRODUCTION_DATABASE="databasename_no_dots"
env PRODUCTION_DATABASE_USERNAME="username_no_dots_or_ands"
env PRODUCTION_DATABASE_PASSWORD="supersecret"

выглядит как нерабочий:

env PRODUCTION_DATABASE_HOST="xxx2.database.windows.net"
env PRODUCTION_DATABASE_PORT=1433
env PRODUCTION_DATABASE="other_databasename_no_dots"
env PRODUCTION_DATABASE_USERNAME="username_no_dots_or_ands"
env PRODUCTION_DATABASE_PASSWORD="supersecret"

Проблема не в подключении или брандмауэре, потому что я могу подключиться к этому новому серверу Azure с помощью / node_modules / sql-cli. Что может быть не так? Некоторая несовместимость между моей версией Ruby и этим другим экземпляром Azure? У меня нет идей.

Эта куча ошибок может быть вызвана изнутри irb, просто выполнив следующее выражение:

results = ActiveRecord::Base.connection.exec_query("SELECT 1")

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

ОБНОВЛЕНИЕ: ключом к решению этой проблемы оказалось создание нового логина / пользователя Azure (см. https://azure.microsoft.com/en-us/blog/adding-users-to-your-sql-azure-database/). В то время как пользователь-администратор может испытывать искушение работать с некоторыми соединениями с базой данных, в Ruby on Rails он, скорее всего, будет работать бесполезным образом, описанным выше. Поверьте мне, вы можете избежать многих головных болей, если сначала настроите какой-либо другой вход в систему для конкретного приложения. Всего этого можно было бы избежать, если бы Ruby on Rails просто сообщал о том, что у пользователя базы данных недостаточно прав, вместо того, чтобы попасть в безудержную рекурсию.

0 голосов
/ 06 ноября 2019

Вы можете попробовать:

env PRODUCTION_DATABASE_HOST = "xxx2. база данных .windows.net"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...