SQLPS работает нормально на PS4, но не загружается на PS7.

Вопрос или проблема

Я просто пытаюсь получить разумное объяснение, я обошел проблему.

На моем сервере установлены 2 версии PowerShell: 4.0 и 7.4.

Если я открою два консоли и выполню команду Get-Module -ListAvailable, SQLPS отображается в обеих.

Но если я попытаюсь выполнить команду, такую как Invoke-Sqlcmd или Import-Module SQLPS, это работает в PS4, но не работает в PS7:

Import-Module: Не удалось загрузить файл или сборку 'Microsoft.SqlServer.Smo, Culture
=neutral, PublicKeyToken=null'. Система не может найти указанный файл.

Я бы понял (и использовал бы обычный метод “удалить папку и переустановить”), если бы это не работало на обеих версиях. Но это работает хорошо в PS4, PS7 не может найти файл, хотя PS4 может?
Как я сказал, это не настоящая проблема, я смог импортировать свои данные в БД через DTSX, но я просто хочу понять, почему.
Спасибо за любую помощь по этому вопросу.

Ответ или решение

Проблема, с которой вы столкнулись, связана с различиями между версиями PowerShell, особенно между PowerShell 4.0 и PowerShell 7.x. Давайте рассмотрим, что может вызвать ошибку при попытке загрузить модуль SQLPS в PowerShell 7, а также возможные шаги, которые могут помочь в решении этой проблемы.

Причины проблемы

  1. Совместимость между версиями PowerShell:

    • SQLPS — это модуль, разработанный для PowerShell 5.1 и более ранних версий. PowerShell 7.x (основанный на .NET Core) не всегда поддерживает компоненты, разработанные для предыдущих версий PowerShell, так как PowerShell 7 использует .NET 5/6, а не .NET Framework.
    • Некоторые зависимости или библиотеки, используемые в SQLPS, могут не быть доступны или несовместимы с .NET Core, что и вызывает ошибку "Could not load file or assembly".
  2. Отсутствие необходимых сборок:

    • Ошибка, которую вы видите, указывает на то, что в среде PowerShell 7 не может быть загружена сборка «Microsoft.SqlServer.Smo». Это может означать, что необходимая сборка не установлена на ваше устройство, либо она находится в недоступном для PowerShell 7 месте.

Как это исправить

Поскольку вы уже нашли обходной путь через DTSX, это здорово. Однако если вы все же хотите использовать Invoke-Sqlcmd и SQLPS в PowerShell 7, рассмотрите следующие варианты:

  1. Установка SqlServer модуля:

    • Вместо SQLPS попробуйте использовать новый модуль SqlServer, который поддерживает PowerShell 7. Этот модуль включает в себя командлеты, такие как Invoke-SqlCmd, и является кросс-платформенным.
    • Установите модуль SqlServer с помощью следующей команды:
      Install-Module -Name SqlServer -AllowClobber
    • После установки попробуйте импортировать модуль и использовать Invoke-SqlCmd.
  2. Проверка наличия необходимых сборок:

    • Убедитесь, что у вас установлены все необходимые зависимости для модуля SQLPS, если вы все-таки хотите его использовать в PowerShell 7. Это может включать поиск и установку сборок Microsoft.SqlServer.Smo и других, которые SQLPS требует.
  3. Запуск PowerShell 7 с использованием Windows Compatibility Module:

    • Если вам необходимо запускать старые модули, можно использовать Windows Compatibility Module, который позволяет выполнять коды и модули, написанные для PowerShell 5.1, в PowerShell 7.
    • Это делается с помощью команды:
      Import-Module WindowsCompatibility
  4. Проверка переменных окружения:

    • Убедитесь, что PATH переменной окружения включает пути к необходимым библиотекам SQL Server и SMO, это может помочь в нахождении необходимых файлов.

Заключение

Общая причина проблемы в том, что SQLPS уже не поддерживается для более поздних версий PowerShell на платформе .NET Core. Для нового кода и проектов рекомендуется использовать модуль SqlServer. Если у вас есть какие-либо дополнительные вопросы или нужны уточнения, пожалуйста, дайте мне знать!

Оцените материал
Добавить комментарий

Капча загружается...