当 运行 父包处于调试模式时,为什么子 SSIS 包的 .dtsx 文件会在 BIDS 中打开?
Why does child SSIS package's .dtsx file get opened in BIDS when running parent package in debug mode?
SSIS 2008 R2 + 投标
我正在重写 ETL 作业。该作业由大约 50 个步骤组成,其中一些是 SSIS 包,一些只是存储的 proc 调用。我正在编写一个包装程序(Gatekeeper)来检查其中哪些 "steps" 已准备好执行,然后执行适当的 .dtsx 程序包或存储的程序。
当 Gatekeeper 启动时,调用存储过程以获取当前 运行 的 "steps" 列表。然后它通过 Foreach Loop
,根据标志列检查 "step" 是包还是过程,然后动态地 运行 为该步骤选择适当的任务类型。该步骤完成后,我记录成功或失败,并迭代 Foreach 循环。
到目前为止,我已经了解了业务逻辑以及包和存储过程的动态执行是否正常工作。对于存储过程调用,我在字符串变量中构建查询,并使用 Execute SQL Task
并将 SqlStatementSourceType
设置为 Variable
。对于包,我使用 Execute Package Task
,它使用 File Connection Manager
,后者使用表达式将 ConnectionString 设置为文件系统上 .dtsx 文件的路径。
这一切都按照我想要的方式工作,并且在适当的时间执行适当的存储过程和程序包。
所以问题是什么?我注意到,当 Gatekeeper 必须连续执行 2 个或更多包时,当它每次连续点击 Execute Package Task
时,BIDS 会尝试打开先前完成的子包。我们使用的所有包都使用密码加密(所有文件都相同),当 BIDS 尝试打开文件时,我得到 "Package Password" 提示。
奇怪的是,如果顺序是 Package -> proc -> package
,奇怪的文件打开行为不会发生。我已经尝试更改子包和 Gatekeeper 中的各种 DelayValidation
值,我已经尝试 运行ning 在父进程的内部和外部,但这些似乎没有任何影响关于这个问题。
这是 Gatekeeper Control Flow
的屏幕截图:
File Connection Manager
的配置如下:
下面是 Execute Package Task
的配置:
编辑:
凭直觉,我尝试先发制人地在 BIDS 中打开两个子包,然后再 运行 执行 Gatekeeper 的测试。我看着 BIDS 连接到第一个子包并在调试模式下完成它的任务。 "Cool, maybe it was just trying to open the file to run it in debug mode"我想。没有。一旦它命中第二个子包,BIDS 就会尝试打开第一个子包的另一个副本。
编辑 2:
在我发布之前的编辑后,我意识到我可能没有打开 Gatekeeper 试图打开的完全相同的文件 运行。我打开了 TFS 本地文件夹中的源文件,而不是实际部署到文件系统的包。所以我关闭了子文件的源文件,并让第一个部署的子文件保持打开状态并重新运行 Gatekeeper。它在第一次迭代时仍然挂钩到打开的子文件中,令我惊讶的是,它在第二次迭代时没有尝试打开子文件 #1 的另一个副本。
所以我现在的想法是,这是 BIDS 的某种奇怪的调试问题。我的下一个测试是将 Gatekeeper 部署到测试服务器,看看我 运行 在通过 SQL 代理作业执行它时是否遇到任何问题。
我从来没有弄清楚 BIDS 的问题,但我找到了解决方法。我没有尝试直接从 Gatekeeper 执行 child 程序包,而是有一个 SQL 代理作业,其中包含所有 children 作为单独的步骤。每个步骤都配置为在成功或失败时退出。
Gatekeeper 调用一个存储过程,该过程提供准备执行的 child 步骤的 job_id 和 step_id。然后它使用这些值在 Execute SQL Task
中执行 msdb.dbo.sp_start_job
。我使用的代码是:
DECLARE @step VARCHAR(100)
,@Job VARCHAR(100)
SET @step = ?
SET @Job = ?
EXEC msdb.dbo.sp_start_job @job_id = @job, @step_name = @step
我不得不稍微更改一下 Control Flow
。我不再关心 child 是 proc 还是 SSIS 包,但我需要在开始 child 作业之前检查 "child steps" 作业不是 运行步骤,但我不得不添加一些等待,这样 SSIS 就不会过早地尝试执行 sp_start_job
。
SSIS 2008 R2 + 投标
我正在重写 ETL 作业。该作业由大约 50 个步骤组成,其中一些是 SSIS 包,一些只是存储的 proc 调用。我正在编写一个包装程序(Gatekeeper)来检查其中哪些 "steps" 已准备好执行,然后执行适当的 .dtsx 程序包或存储的程序。
当 Gatekeeper 启动时,调用存储过程以获取当前 运行 的 "steps" 列表。然后它通过 Foreach Loop
,根据标志列检查 "step" 是包还是过程,然后动态地 运行 为该步骤选择适当的任务类型。该步骤完成后,我记录成功或失败,并迭代 Foreach 循环。
到目前为止,我已经了解了业务逻辑以及包和存储过程的动态执行是否正常工作。对于存储过程调用,我在字符串变量中构建查询,并使用 Execute SQL Task
并将 SqlStatementSourceType
设置为 Variable
。对于包,我使用 Execute Package Task
,它使用 File Connection Manager
,后者使用表达式将 ConnectionString 设置为文件系统上 .dtsx 文件的路径。
这一切都按照我想要的方式工作,并且在适当的时间执行适当的存储过程和程序包。
所以问题是什么?我注意到,当 Gatekeeper 必须连续执行 2 个或更多包时,当它每次连续点击 Execute Package Task
时,BIDS 会尝试打开先前完成的子包。我们使用的所有包都使用密码加密(所有文件都相同),当 BIDS 尝试打开文件时,我得到 "Package Password" 提示。
奇怪的是,如果顺序是 Package -> proc -> package
,奇怪的文件打开行为不会发生。我已经尝试更改子包和 Gatekeeper 中的各种 DelayValidation
值,我已经尝试 运行ning 在父进程的内部和外部,但这些似乎没有任何影响关于这个问题。
这是 Gatekeeper Control Flow
的屏幕截图:
File Connection Manager
的配置如下:
下面是 Execute Package Task
的配置:
编辑:
凭直觉,我尝试先发制人地在 BIDS 中打开两个子包,然后再 运行 执行 Gatekeeper 的测试。我看着 BIDS 连接到第一个子包并在调试模式下完成它的任务。 "Cool, maybe it was just trying to open the file to run it in debug mode"我想。没有。一旦它命中第二个子包,BIDS 就会尝试打开第一个子包的另一个副本。
编辑 2:
在我发布之前的编辑后,我意识到我可能没有打开 Gatekeeper 试图打开的完全相同的文件 运行。我打开了 TFS 本地文件夹中的源文件,而不是实际部署到文件系统的包。所以我关闭了子文件的源文件,并让第一个部署的子文件保持打开状态并重新运行 Gatekeeper。它在第一次迭代时仍然挂钩到打开的子文件中,令我惊讶的是,它在第二次迭代时没有尝试打开子文件 #1 的另一个副本。
所以我现在的想法是,这是 BIDS 的某种奇怪的调试问题。我的下一个测试是将 Gatekeeper 部署到测试服务器,看看我 运行 在通过 SQL 代理作业执行它时是否遇到任何问题。
我从来没有弄清楚 BIDS 的问题,但我找到了解决方法。我没有尝试直接从 Gatekeeper 执行 child 程序包,而是有一个 SQL 代理作业,其中包含所有 children 作为单独的步骤。每个步骤都配置为在成功或失败时退出。
Gatekeeper 调用一个存储过程,该过程提供准备执行的 child 步骤的 job_id 和 step_id。然后它使用这些值在 Execute SQL Task
中执行 msdb.dbo.sp_start_job
。我使用的代码是:
DECLARE @step VARCHAR(100)
,@Job VARCHAR(100)
SET @step = ?
SET @Job = ?
EXEC msdb.dbo.sp_start_job @job_id = @job, @step_name = @step
我不得不稍微更改一下 Control Flow
。我不再关心 child 是 proc 还是 SSIS 包,但我需要在开始 child 作业之前检查 "child steps" 作业不是 运行步骤,但我不得不添加一些等待,这样 SSIS 就不会过早地尝试执行 sp_start_job
。