我们有一个SSIS包,可以从共享网络目录中读取文本文件。当我在SSDT中执行此包时,它工作正常。然而,当我们将项目部署到 Integration Services Catalog
并尝试从那里运行相同的包时,我收到一个错误,表明对该目录的访问被拒绝。
我一直认为,当我登录数据库并从Integration Services目录中执行SSIS包时,它使用了我的用户凭据,因此可以访问相关目录,因为我的用户配置文件具有访问它。
情况不是这样吗? SQL Server是否使用其他用户来执行IS目录中的包?是否可以选择 run as another user
?任何意见都将不胜感激。
答案 0 :(得分:38)
运行 SQL Server Data Tools (SSDT)
的用户凭据将用于执行在SSDT中执行的程序包。
在Windows Start \ All Programs \ Microsoft SQL Server 2012下,如果单击SQL Server数据工具,它将在您的凭据下运行。要在不同的用户帐户下运行,您可以按 Ctrl + Shift 选择 Run as different user
选项。
右键单击 Integration Services Catalog \ SSISDB \ <Folder name> \ Projects \ <Project name> \ Packages \ <Package name>
下的软件包,然后选择Execute...
运行软件包。该程序包将在用于连接到SQL Server Management Studio的凭据下运行。
请注意,如果您尝试使用SQL Server身份验证运行程序包,则会收到以下错误消息:
使用SQL Server身份验证的帐户无法启动该操作。使用使用Windows身份验证的帐户启动操作。
按Execute...
后,SQL Server
会启动流程ISServerExec.exe
,从而启动Console Window Host
流程:
ISServerExec.exe
是一个在SSIS目录中执行包的程序。在这种情况下,它是在从SQL Server Management Studio执行SSIS包的同一用户下启动的。
从 SQL Server代理作业中运行SSIS包时,默认情况下作业步骤在 SQL Server Agent Service Account
下运行。可以通过导航到 Windows Start \ Administrative Tools \ Services
找到与SQL Server代理服务相关联的用户帐户,查找服务SQL Server代理(Your Instance Name
)并找到下列出的用户帐户> Log On As
您还可以通过创建代理帐户在不同凭据下运行SQL Server代理作业。在代理帐户下执行作业步骤时,作业步骤中的包将在代理帐户上指定的凭据下执行。
以下SO答案提供了创建代理帐户以运行SQL Server代理作业的逐步说明。
How do I create a step in my SQL Server Agent Job which will run my SSIS package?
以下是我针对用于执行包的用户帐户验证上述语句的方法。
打开SQL Server数据工具并创建名为 SO_15289442.dtsx
的SSIS 2012包。
创建一个名为ExecutionUser
的数据类型为String
的变量。将表达式@[System::UserName]
分配给变量。 UserName
是一个系统变量,提供执行包的用户的信息。
将发送邮件任务拖放到数据流标签上。
创建SMTP连接并将其分配给“发送邮件任务编辑器 - 邮件”页面上的 SmtpConnection
。
指定 From
和 To
电子邮件地址。
将 MessageSourceType 更改为 Variable
。
将 MessageSource
设置为 User::ExecutionUser
。
右键单击该软件包,然后选择“部署”以将项目部署到您选择的服务器上可用的Integration Services目录。
在SSDT中运行包。
使用“以不同用户身份运行”选项打开SSDT。提供除您之外的其他凭据并再次运行该包。
从Integration Services目录运行包。
使用SQL Server代理服务帐户创建SQL Server代理作业以运行程序包。
创建SQL Server代理作业以使用代理帐户运行包。
对于上述每次执行,您都会收到一封电子邮件,其中包含用于执行该程序包的用户帐户。
在您的情况下,如果右键单击并选择“从Integration Services目录执行”,则程序包将在您的帐户下执行(假设您使用凭据访问SSISDB )。确保该文件夹可以访问网络路径。
如果从SQL Server代理作业中运行包,则代理帐户是您正在查看的run as another user
选项。
答案 1 :(得分:3)
听起来您没有在SQL Server上配置Kerberos(双跃点问题)。
以下是使用MS记录的问题,现已修复。 https://connect.microsoft.com/SQLServer/feedback/details/767088/with-the-new-ability-to-execute-ssis-packages-from-tsql-kerberos-delegation-should-be-supported
以下是关于此细节的精彩博文: http://www.sqlscientist.com/2014/01/setup-kerberos-authentication-for-sql.html
配置完成后,您应该可以使用本地计算机上的存储过程或SSMS远程启动作业。如果配置正确,它将通过您的凭据,当然您必须确保您具有访问网络资源的适当权限。
答案 2 :(得分:0)
这是一个旧线程,但我想你遇到的问题实际上是文件的路径。 您使用的是UNC名称还是驱动器号。也就是说,你的文件路径是“Z:\ path \ to \ file.csv”还是“\ server \ share \ path \ to \ file.csv”?
如果它是一个驱动器号,它可以正常工作,因为您已映射该驱动器,但由于未映射驱动器号,它将在服务器上失败。