SSIS-序列化/锁定程序包

时间:2019-07-07 23:15:03

标签: ssis etl netezza

长话短说,我需要使用SSIS在Netezza中创建一个序列。

我计划创建一个通用包,该包将查找某些表,并基于自然键和源,它将返回替代键(如果存在)或创建一个新键,然后将其返回给调用SSIS包。

此软件包将由多个SSIS软件包调用,每个来源一个。我的问题是,它们可能同时运行,并同时调用此程序包,这可能导致代理键中的唯一性问题。

有什么建议吗?

谢谢

1 个答案:

答案 0 :(得分:0)

创建子(查找)包,然后通过执行该包的单个步骤创建一个SQL Agent Job。然后,您的父包可以执行作业,而不是直接执行该包。 SQL代理将负责“锁定”程序包,因为作业只能运行一个实例。

您可能需要构建某种等待机制。您可以查询msdb.dbo.sysjobactivity以确定作业是否正在运行。

我最近建立了一个程序包,该程序包几乎可以完成您要尝试执行的操作。最终结果如下所示: enter image description here

在第一步“执行SQL”中,我得到JobId和步骤名称。被调用的proc使用以下查询(我传入@JobName):

SELECT @JobId = job_id 
FROM msdb.dbo.sysjobs
WHERE name = @JobName

然后,Is the job running执行SQL任务执行以下查询以检查作业是否正在运行:

DECLARE @JobId UNIQUEIDENTIFIER
SET @JobId = ?

SELECT 
Running = 
CASE 
    WHEN start_execution_date IS NOT NULL AND stop_execution_date IS NULL 
    THEN 1
    ELSE 0
END
FROM msdb.dbo.sysjobactivity 
WHERE job_id = @JobId

我将值保存到变量,然后启用和禁用适当的路径。如果作业正在运行,我将等待30秒,然后Wait while job is running循环会重新启动并再次检查作业活动状态。

放置了1秒的等待时间,以便给db引擎足够的时间来更新作业活动表。我的程序包失败,因为它执行检查的速度太快,并认为可以启动下一个作业执行。通过暂时暂停,我们可以在检查作业活动状态时获得准确的结果。

程序包到达Start Job Step后,它将执行以下查询以启动工作:

DECLARE @step VARCHAR(100)
,@Job VARCHAR(100)

SET @step = ?
SET @Job = ?

EXEC msdb.dbo.sp_start_job @job_id = @job, @step_name = @step

如果您的情况是您不需要指定步骤,因为您的查找包作业将只包含一个步骤。