我有一个SSIS包,它通过SSIS服务器(服务器A)上的SQL作业运行,该服务器在数据库服务器(服务器B)上执行存储过程。此存储过程从位于SSIS服务器(服务器A)上的文件共享执行批量插入。但是,每次存储过程运行时,它都会失败,并显示以下错误:
执行成员资格流程:错误:执行查询" exec storedprocname?,?"失败并出现以下错误:"无法批量加载,因为文件" \ ServerA \ TestLoads \ Membership \ Processing \ filename.csv"不能打开。操作系统错误代码5(拒绝访问。)。"。可能的失败原因:查询问题," ResultSet"属性设置不正确,参数设置不正确或连接未正确建立。
我非常肯定这个问题与权限有关。如果我将文件存储在数据库服务器(服务器B)上,则它会进行处理。或者,如果我手动运行proc,它将起作用。
当我在服务器A上执行作业时,它将作为该服务器的服务帐户执行。该帐户可以完全访问服务器A和服务器B(SQL中和管理服务器上的管理员)。我相信正在发生的事情是第一次传递凭据,但是一旦存储的proc运行它们就不会继续。我在服务器A(SSIS服务器)上运行wireshark,以便我可以看到访问共享的内容并尝试获取更多信息。我发现没有传递任何帐户信息,它只是空白。
我经历了很多步骤只是为了试着看看是否可以获得这样的工作,例如授予每个人访问共享,启用访客帐户,允许匿名用户等等。不是我想做的事情,而是尝试缩小问题范围。这些都没有奏效。
我尝试修改存储过程以使用WITH EXECUTE AS OWNER。仍然没有工作,但得到了不同的错误。还尝试了各种其他帐户执行,每次都得到相同的错误。
执行成员资格流程:错误:执行查询" exec [storedprocname]?,?"失败,出现以下错误:"无法获取有关Windows NT组/用户'',错误代码0x5的信息。"。可能的失败原因:查询问题," ResultSet"属性设置不正确,参数设置不正确或连接未正确建立。
尝试了我在网上找到的各种解决方案,以实现这一目标,到目前为止还没有做到这一点。
我知道这不是一个理想的解决方案。我的印象是开发人员最初使用SSIS来加载文件,然后使用SQL来完成剩下的工作。但是因为SQL必须触及文件系统才会失败。而在这个阶段,没有选择重写这个。此外,如果我们将文件移动到数据库服务器(服务器B),此过程将起作用,但这消除了我们首先需要使用SSIS服务器以便从文件服务器处理文件的大量需求< / p>
有关是否有办法让当前解决方案有效的任何想法?基本上,我认为我需要的是运行SSIS包以及在此过程中通过存储过程将凭据传递到文件共享的方法。
我们在两台服务器和SQL Server 2012 sp3开发人员版上都使用Windows Server 2012 R2。
感谢您的帮助!
答案 0 :(得分:0)
之前我遇到过这个问题,但我仍然不完全理解 Kerberos身份验证,但这对我来说已经解决了。这与认证的“双跳”有关,即从SSIS,通过SQL Server到网络服务器的信誉。
尝试为SQL Server设置 Kerberos身份验证。这里有截图的详细分步说明=&gt; Setup Kerberos Authentication for SQL Server
我理解这就像是一个“仅链接”的答案,但我不想复制粘贴&amp;剽窃作者的原创作品,即博客文章,因此链接。