2015-01-20 128 views
1

我有一个ASP.NET应用程序,我想同时多次执行一个SSIS包(该包可能需要一段时间才能执行,而且我希望能够在启动之前启动另一个实例第一个完成)。 Web服务器与SQL Server不在同一台服务器上,并且没有安装SQL Server或SSIS。同时多次远程执行SSIS包

我可以通过将它包装在SQL作业中并使用sp_start_job来执行SSIS,但由于SQL作业不能同时运行两次,所以这对我不起作用。

From what I understand,.NET无法直接启动SSIS,而无需在客户端上进行特殊安装,我不会这样做。而且我不能在SQL服务器上安装特殊的远程处理程序。

任何想法如何做到这一点给予这些限制?我有很多其他解决方法可以探索,但是如果可以的话,我想使用SSIS。

的SQL Server 2008 R2和.NET 4.5

编辑

我发现使用xp_cmdshell,我不认为会飞到因为这似乎是一个安全问题,一些解决方案 - 或者通过创建即时执行作业,然后删除作业,但用户帐户将无权在服务器上创建作业。

回答

1

您不能运行不止一次相同的SQL代理作业,那么为什么不作弊?

与其说sp_start_job,如果你叫sp_add_jobsp_add_job_step然后什么援引sp_start_job

由于我指定delete_level = 1,作业将成功执行后删除自身。

给定以下作业定义,在IAmUnique末尾附加一个GUID或类似的内容,然后使用boom,unique job name,并且可以同时运行它们。

DECLARE @jobId binary(16) 
EXEC msdb.dbo.sp_add_job 
    @job_name = N'IAmUnique' 
, @enabled = 1 
, @notify_level_eventlog = 0 
, @notify_level_email = 2 
, @notify_level_netsend = 2 
, @notify_level_page = 2 
, @delete_level = 0 
, @category_name = N'[Uncategorized (Local)]' 
, @owner_login_name = N'EU\u001899' 
, @job_id = @jobId OUTPUT; 

EXEC msdb.dbo.sp_add_jobstep 
    @job_name = N'IAmUnique' 
, @step_name = N'Run package' 
, @step_id = 1 
, @cmdexec_success_code = 0 
, @on_success_action = 1 
, @on_fail_action = 2 
, @retry_attempts = 0 
, @retry_interval = 0 
, @os_run_priority = 0 
, @subsystem = N'SSIS' 
, @command = N'/SQL "\New Package" /SERVER "localhost\dev2008" /CHECKPOINTING OFF /REPORTING E' 
, @database_name = N'master' 
, @flags = 0; 

EXEC msdb.dbo.sp_update_job 
    @job_name = N'IAmUnique' 
, @enabled = 1 
, @start_step_id = 1 
, @notify_level_eventlog = 0 
, @notify_level_email = 2 
, @notify_level_netsend = 2 
, @notify_level_page = 2 
, @delete_level = 1 
, @description = N'' 
, @category_name = N'[Uncategorized (Local)]' 
, @notify_email_operator_name = N'' 
, @notify_netsend_operator_name = N'' 
, @notify_page_operator_name = N''; 
+0

我不打算考虑这个选项,因为用户需要创建工作的权利,我认为这会让它变得太强大,并且不会是一个很好的安全策略。但是,当我查看权限时,看起来我们可以授予该帐户最低的代理权限 - [SQLAgentUserRole](https://msdn.microsoft.com/en-us/library/ms188283.aspx) - 而不给它它不应该有一堆权限。我会深入研究一下,看看它是否有效。 – 2015-01-21 18:48:40

+0

@JoeEnos您可以通过创建一个存储过程来进一步限制,该存储过程能够创建并运行作业,并且仅授予应用程序执行该过程的能力,然后使用类似于“执行AS”的特性来执行更高特权级别的操作。我想如果你让应用程序执行任务,可能不是让它创建它们的更大问题。 – billinkc 2015-01-21 19:48:11

+0

有道理,谢谢。 – 2015-01-21 20:21:08

3

您应该能够从存储过程启动包。具体来说,我会看看catalog.create_execution方法。然后从ASP.NET调用存储过程。

以下MSDN文档可能会有帮助:Deploy and Execute SSIS Packages using Stored Procedures

编辑:以上仅适用于SQL Server 2012的和更新。对于较老的,你可能需要使用DTExec从命令行运行SSIS包,这也可以通过存储过程来实现。

请参阅以下内容:Executing a SSIS Package from Stored Procedure in SQL Server

+0

看起来这是SQL2012中的新功能,所以对我来说这是不可行的。但它在2012年肯定看起来是正确的。谢谢。 – 2015-01-20 21:03:16

+0

@JoeEnos你说得对,我忽略了这一点。您可能需要通过存储过程从命令行运行DTExec。以上我的更新为例。 – 2015-01-20 21:08:09