【问题标题】:Execute SSIS from Asp.net Application从 Asp.net 应用程序执行 SSIS
【发布时间】:2009-08-01 00:33:01
【问题描述】:

我正在尝试运行一个简单的 SSIS 包(将数据从外部文件夹复制到 SQL 2005 表中)。我想从 Asp.net 2.0 应用程序运行这个包。有什么建议吗?

我搜索了很多不同的博客和网站,但所有这些方法都会导致失败(通常是因为安全问题)

dtexec /FILE "包名"等

EXEC master..xp_cmdshell @cmd(据说是个很糟糕的主意)

sp_start_job

app.LoadPackage(@"\servername\sharename\Package1.dtsx", null)

提前感谢您能给我的任何帮助。

【问题讨论】:

  • 我也想知道这个问题的答案。
  • wtaniguchi 和 Eric,非常感谢您的帮助。您的解决方案可能更好、更健壮,但为了适应我们的设置,我执行了以下操作。这就是我让它运行的方式:
  • 我的 dba 必须授予我执行 sp_start_job 任务的权限(这是通过特定域帐户完成的)。我相信他还必须授予我以下角色的权利: SQLAgentOperatorRole SQLAgentReaderRole SQLAgentUserRole 然后我使用以下微软代码通过 .net 2.0 运行它:msdn.microsoft.com/en-us/library/ms403355.aspx 我逐字获取代码,只需更改以下内容即可我的工作名称:jobParameter.Value = "RunSSISPackage"

标签: asp.net ssis


【解决方案1】:

好吧,杰克,你列出的只是半正确答案的大杂烩。

有很多方法可以启动 SSIS 包。但是,最好的方法可能是sp_start_job。现在,这意味着您有 created a job 将运行您的 SSIS 包。

很多时候,这只小狗因为凭证问题而失败。也就是说,您正试图以 SQL Server 代理帐户(又名LOCAL SYSTEM)的身份运行该死的东西,这对于执行能力来说并不是一个好兆头。因此,您需要create a Credential,然后a Proxy 才能运行作业。因此,您需要做的是:

CREATE CREDENTIAL MyCred WITH IDENTITY 'CORP\MyUser', SECRET = '<PassGoesHere>'
GO
sp_add_proxy @proxy_name='MyProxy', @enabled = 1, @credential = 'MyCred'
GO
sp_grant_proxy_to_subsystem @proxy_name = 'MyProxy', @subsystem_id = 3
GO
sp_add_job @job_name = 'MyJob', @enabled = 1
GO
sp_add_jobstep 
    @job_name = 'MyJob', 
    @step_name = 'Run SSIS Package', 
    @subsystem = 'CMDEXEC', 
    @command = 'dtexec /F C:\Path\To\Package.dtsx', 
    @proxy_name = 'MyProxy'

有意义的文档:

  1. CREATE CREDENTIAL
  2. sp_add_proxy
  3. sp_grant_proxy_to_subsystem
  4. sp_add_job
  5. sp_add_jobstep

【讨论】:

  • Eric,感谢您对此问题的快速响应和帮助。我可能应该提到这一点,但我无权访问 SSMS。我被引导相信这是因为 SQL 2005 的设置方式,但也许 DBA 已将其完全锁定。在 SQL 2000 中,我们可以只进入“数据转换服务”和“管理”/“SQL Server 代理”。我现在在 SQL 2005 中没有类似的东西可用。
  • @Jack:将其更改为纯 SQL。享受吧。
  • 谢谢,埃里克。我一定会试试这个!有没有办法给你加分? (我以前从未使用过这个网站)。
  • @Jack:您可以为答案投票(点击旁边的 ^),如果它解决了您的问题,您可以接受答案(点击投票下的复选标记)。投票给我+10,接受的答案给我+15。这适用于本网站上的任何问题和答案。当然,您只能接受自己问题的答案。但是您可以对您在此处看到的任何问题或答案进行投票。
  • 谢谢,埃里克!!!这很尴尬,但我什至无法运行 SQL 的第一部分。 “消息 15247,级别 16,状态 1,行 1 用户无权执行此操作。”我想我可以在这里看到 dbas 对我们的信任程度。我会继续寻找!
【解决方案2】:

在服务器端使用 ASP.NET 应用程序与我猜想的任何其他 .NET 应用程序非常相似。我在这里有一个运行 SSIS 包 (SQLServer 2008) 的代码示例,但我无法在此处复制和粘贴它,因为我在这个项目中的 NDA 上。

但我可以告诉你,我们正在使用一个名为 Microsoft.SqlServer.Dts.Runtime.Wrapper 的命名空间、接口 Package 和 Application 以及 DTSExecResult 枚举...并且它工作正常。

我们还将 Excel 工作表导入到我们的数据库中。

编辑: 以下是我们如何在此处执行此操作的概述: 我们有 Excel 表格,其中包含我们要导入系统的数据。我们的系统由 ASP.NET 3.5/Castle Project/SQLServer 2008 驱动。 一旦用户将新工作表上传到您的系统中,我们会将其存储在一个文件夹中,例如“c:\UPLOAD”。触发了一个动作,因此我们调用我们的 SSIS 包将其导入 SQL Server 2008。

我们如何实现它(C#):

Package package;
Application app;
DTSExecuteResult packageResult;

String packagePath = ""; // You have to get your physical path to your package.

app = new Application();
app.PackagePassword = "password"; // We have it here..
package = (Package)app.LoadPackage(packagePath, true, null);
packageResult = package.Execute();

所有这些类都来自同一个命名空间,Microsoft.SqlServer.Dts.Runtime.Wrapper,正如我之前所说的。

如果您遇到访问问题,我想您最好让您的 DBA 提高您的权限,甚至创建一个新的权限来运行 SSIS 的包,因为它需要额外的权限级别。

希望对你有帮助。

【讨论】:

  • 感谢您的帮助。我一直在尝试使用“Microsoft.SqlServer.Dts.Runtime”类,但也许添加包装器会有所帮助。
  • 您好,只是想知道您能否提供更多关于您如何使其工作的见解?埃里克在下面帮助我,但我没有使用他的建议的适当权限。谢谢!
  • 是的,我会看看它,也许会给你一个“新”的例子。很快编辑我的答案。
  • 谢谢!我正在尝试一些非常相似的东西,并且遇到了访问问题,所以我需要与我的 DBA 合作。我目前正在与他合作以允许对 msdb 中 sp_start_job sp 的权限。只是好奇 - 我假设包路径需要在我部署它的服务器上(我的电脑或应用程序服务器上没有 SSIS)?
  • 您将需要来自 SSIS 的 DLL,但由于该类在使用 SSIS 完成任务之前将文件加载到内存中,因此我看不出有任何理由使这种实现在部署时失败不同的机器。事实上,我们的项目将有不同的数据库服务器。如果您能够在您的开发站中构建您的应用程序,那么您将不会遇到任何问题。尽管您将需要包含我们讨论过的命名空间的 DLL(我对此没有任何问题,我正在我的开发机器上运行您的数据库的测试实例)。
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多