今天把一个package从测试环境移到生产环境上, 结果报出了下面的错误. 大意是说在调用到web service控件的时候, 因为代理不能正确生成, 所以这个控件运行失败了, 还煞有介事的列出了一个缺失的文件路径来.
Package Name: packagename
-1073548540
An error occurred with the following error message:"Microsoft.SqlServer.Dts.Tasks.WebServiceTask.WebserviceTaskException:Could not generate the proxy for the specified Web service. The following errors were encountered while generating the proxy: Source file'C:\Windows\TEMP\tretiafj.0.cs' could not be found No source files specified .
atMicrosoft.SqlServer.Dts.Tasks.WebServiceTask.WebServiceTaskUtil.Invoke(DTSWebMethodInfomethodInfo, String serviceName, Object connection, VariableDispensertaskVariableDispenser)
atMicrosoft.SqlServer.Dts.Tasks.WebServiceTask.WebServiceTask.executeThread()".
先简单说下这个package的作用是什么. 首先它会先从另一个数据库的某张表读出一些数据并存在本地数据库的某个表里, 然后有一系列的计算逻辑来判断数据是不是真的更新了 (这里不光涉及到数据的更新时间, 还需要对某些列进行计算, 当计算结果比上次的计算结果有不同的情况下才认为是真的更新了).
如果更新了, 就通过一个web service 控件来触发Qlikview EDX事件, 进而让指定的qlikview文件开始刷新. (对Qlikview EDX感兴趣的同学可以参考下面英文文章)
https://community.qlik.com/docs/DOC-3024
https://community.qlik.com/docs/DOC-2650
再回到问题本身, 其实原因和运行这个job的账号有关系, 解决方法有两个:
第一个是确保生产环境运行package的账号有权限访问 C:\windows\temp文件夹
第二个方法是修改protection level, 从EncryptSensitiveWithUserKey或别的什么改成 Dont Save Sensitive.
EncryptSensitiveWithUserKey 就意味着你在web service控件中指定的密码会被加密, 只有开发者的id才能解密. 这种情况下你就得在SQL Agent Job中使用代理账户, 里面填上开发者的账号密码才能成功运行这个package. 我相信多数人都不会希望这么干的, 还是用服务账号更好一些, 所以更简单的方法就是改成Dont Save Sensitive