Подтвердить что ты не робот

Повторное развертывание пакетов SSIS - кеш?

Недавно мы заметили, что перераспределенные пакеты SSIS иногда не включают последние изменения... Когда я просматриваю dtsx с помощью блокнота, я вижу измененный script в коде, поэтому изменения, безусловно, есть.

Мое предположение заключалось в том, что компоненты пакетов SSIS script в конечном итоге скомпилированы в сборку где-то в процессе - это вполне вероятно, так как я предполагаю, что код С# не может работать без компиляции. Поэтому теоретически, если эти сборки затем будут кэшироваться и не будут немедленно перезаписаны (по какой-то причине), это объяснит эту проблему.

Единственное "доказательство", которое заставляет меня думать, что моя теория верна, - если я продолжаю запускать пакет в какой-то момент, он внезапно переходит к новому коду.

Однако до сих пор я не нашел, почему и как это происходит, если есть... Может ли кто-нибудь помочь?

UPDATE: MSDN говорит: "В отличие от более ранних версий, где вы могли бы указать, были ли предварительно скомпилированы сценарии, все сценарии предварительно скомпилированы в SQL Server 2008 Integration Services (SSIS) и более поздних версиях". - Если предварительно скомпилированные они означают, что вместо фактического пакета запускается предварительно скомпилированная версия (я думаю, это потому, что сам пакет, похоже, не скомпилирован, поскольку код отображается в "Блокноте" ), должен быть способ принудительно чтобы перезаписать предварительно скомпилированную сборку... но как?

UPDATE: Одним из четырех основных компонентов SSIS является служба SQL ServerIntegration Services, которая является службой Windows. По-видимому, эта служба будет кэшировать метаданные компонентов/задач, чтобы механизм времени выполнения SSIS мог опросить кеш, чтобы увидеть, что установлено, что может ускорить загрузку пакетов. Однако, если пакеты хранятся в файловой системе (а не в службах интеграции SQL) и выполняются с помощью агентских заданий, задание агента будет использовать 64-разрядную версию DTEXEC для выполнения пакетов. Я еще не нашел доказательств того, что там будет задействовано какое-либо кэширование, но есть определенные возможности для проверки ряда параметров на этапе проверки выполнения, таких как номера версий, - может быть по какой-то причине.

4b9b3361

Ответ 1

Это немного знакомо с чем-то, с чем я столкнулся некоторое время назад. К сожалению, я не помню точно , когда я столкнулся с этим (так что я не могу проверить наверняка), но я верю. Исправление, которое я нашел, состояло в том, чтобы убедиться, что Я явно вызвал команду Build | Build st_5bd541c294054c25b9e7eb55b92bd0e2 из меню редактора script (VSTA) перед закрытием окна. (Конкретное имя проекта будет отличаться для каждого script, очевидно, поскольку оно основано на GUID, однако в Build есть только одно возможное подменю.)

Явное приглашение команды Build гарантирует, что двоичный код для script получает ASCII-кодировку и сохраняется в XML полученного файла .dtsx. Я привык к SSIS 2005, всегда создавая для меня всякий раз, когда я закрывал редактор script. По-видимому, есть причудливые крайние случаи, когда SSIS 2008 не всегда создает проект script, когда редактор закрывается.

BTW, предварительно скомпилированные исполняемые файлы, как представляется, хранятся в теге исходного XML-кода под названием BinaryItem:

  <DTS:Executable DTS:ExecutableType="Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask, Microsoft.SqlServer.ScriptTask, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" DTS:ThreadHint="0">
    <DTS:Property DTS:Name="ObjectName">SCR_StepOne</DTS:Property>
    <DTS:ObjectData>
      <ScriptProject Name="ST_5bd541c294054c25b9e7eb55b92bd0e2" VSTAMajorVersion="2" VSTAMinorVersion="1" Language="CSharp" EntryPoint="Main" ReadOnlyVariables="User::FileOneName,User::OutputFolder" ReadWriteVariables="">
        <BinaryItem Name="\bin\release\st_5bd541c294054c25b9e7eb55b92bd0e2.csproj.dll">
          TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
          AAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v
          ZGUuDQ0KJAAAAAAAAABQRQAATAEDADuOb04AAAAAAAAAAOAAAiELAQgAABAAAAAIAAAAAAAAPi8A
          AAAgAAAAQAAAAABAAAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAACAAAAAAgAAAAAAAAMAQIUAABAA

Возможно, стоит проверить историю системы управления исходным кодом, чтобы узнать, обновляется ли она для некоторых из этих ошибок.

Предостережение: я не нашел официальную документацию Microsoft по этому вопросу.

Ответ 2

Вы посмотрели на sysssispackages, чтобы сравнить номер сборки версии пакета в msdb с вашим номером сборки в Visual Studio/SSIS?

SELECT name, verbuild
FROM msdb.dbo.sysssispackages
WHERE name LIKE '%bla%'

(Откорректируйте предложение WHERE как необходимо, чтобы найти свой пакет. Никогда не "ВЫБЕРИТЕ * FROM msdb.dbo.sysssispackages", поскольку он содержит пакет XML в одном из столбцов.)

И в Visual Studio откройте пакет, затем щелкните правой кнопкой мыши на фоне пакета и выберите "Свойства" в контекстном меню. Посмотрите на поле VersionBuild. Он должен соответствовать номеру из SELECT выше!

Я знаю, что это не фактическое решение вашей проблемы, но это может помочь найти причину проблемы. Если число больше, это означает, что развертывание пакета не работает.

Ответ 3

Это специально не устраняет тайну, которую вы имеете, но если вы используете пакеты на базе файловой системы и хотите проверить, что пакет, который запущен, является пакетом, который вы развернули, есть способ сделать это.

  • Создайте свой пакет.
  • Откройте свойства на вашем пакете и запишите свойство "Версия сборки" (в качестве альтернативы откройте .dtsx в блокноте и найдите атрибут DTS: VersionBuild.)
  • Разверните свой пакет.
  • На шаге задания агента SQL перейдите на вкладку "Проверка".
  • Введите конструкцию версии в поле ввода "Проверить сборку пакета".
  • Выполнение задания.

Я не знаю, заставит ли SSIS выкинуть свой кеш и получить недавно развернутый пакет, но я знаю, если вы измените номер сборки пакета .dtsx вручную, а затем попытайтесь повторно запустить этап задания он терпит неудачу, потому что сборка пакета не соответствует тому, что она ищет, поэтому она определенно выполняет проверку времени выполнения.