无法部署SSIS项目 - 执行" encrypt_binarydata"时出错。

时间:2017-06-20 16:25:53

标签: sql-server ssis

我创建了一个具有DontSaveSensitive保护级别的SSIS项目,并且在今天之前已经多次愉快地部署到本地服务器。但是,我现在在部署时遇到以下错误:

  

执行用户定义时发生.NET Framework错误   例程或聚合" encrypt_binarydata":   System.IO.FileLoadException:无法加载文件或程序集   ' System.Core,Version = 4.0.0.0,Culture = neutral,   公钥= b77a5c561934e089'或其中一个依赖项。不   足够的存储空间可用于处理此命令。 (例外   HRESULT:0x80070008)System.IO.FileLoadException:at   Microsoft.SqlServer.IntegrationServices.Server.Security.CryptoGraphy.CreateSymmetricKey(字符串   算法)   Microsoft.SqlServer.IntegrationServices.Server.Security.CryptoGraphy.EncryptBinaryData(的SqlString   algorithmName,SqlBytes key,SqlBytes IV,SqlBytes binaryData)。   (Microsoft SQL Server,错误:6522)

我有一个谷歌,但没有特别引用encrypt_binarydata。有许多对deploy_project_internaluntrusted assemblies的引用,但在此特定问题上没有任何内容。

重要的部分似乎

  

没有足够的存储空间来处理此命令

但是我无法做到这一点,因为有许多GB的内存和大量的驱动器空间可供使用,所以资源不应该成为问题。

任何人都可以了解这个错误指的是什么,理想情况下我可以解决它吗?

1 个答案:

答案 0 :(得分:1)

事实证明,这是一个问题,在SQL和dll文件之间的SSISDB内部工作中,权限变得非常混乱。原始问题中的错误消息实际上是一个红色的鲱鱼,真正的问题与this excellent resolution中解决的问题相同。

为了后人的缘故以防止答案消失(以及对于不想点击其他链接的懒人),这里是完整的参考答案

归功于Remus Rusanu

具有EXTERNAL_ACCESS的程序集通过一些复杂的路径落在EXECUTE AS路径下。问题出现在“dbo'无法映射到有效的登录名。 dbo的登录是在sys.databases中具有owner_sid值的SID的登录。除非在CREATE DATABASE中使用了AUTHORIZATION子句,否则owner_sid是发出CREATE DATABASE语句的主体的登录sid。大多数情况下,这是登录用户的Windows SID并发出CREATE DATABASE。掌握了这些知识,人们可以很容易地想到可能出现的问题:

  • 复制数据库:由A本地用户(即MachineA\userDomainA\user)在机器A上发出CREATE DATABASE,然后将数据库复制到机器B(通过备份/恢复或通过文件)复制)。 owner_sid由文件复制以及备份/恢复保留,在机器B上,owner_sid无效。一切都需要EXECUTE As失败,包括从数据库加载程序集。
  • 墓碑帐户。 CREATE DATABASE由已离开公司的用户发布。 AD帐户被删除,所有突然的EXECUTE AS都会出现故障,包括加载程序集。
  • 断开笔记本电脑。当笔记本电脑连接到工作网络时,CREATE DATABASE出现了问题。在家中,您可以使用Windows缓存凭据登录,但EXECUTE AS希望连接到不可用的AD并失败。加载程序集也会失败。当你再次触及AD时,问题会在第二天工作时神秘地解决。
  • 参差不齐的AD连接​​。 EXECUTE AS不使用系统缓存凭据并且每次都连接到AD。如果AD连接存在问题(超时,错误),则这些问题在EXECUTE AS中显示为类似的超时和错误,包括加载程序集

所有这些问题都可以通过在问题db的上下文中运行:EXECUTE AS USER = 'dbo';来诊断。它失败并出现错误,那么程序集加载问题的原因是dbo的EXECUTE AS上下文。

解决方案很简单,只需强制owner_sid有效登录即可。 sa通常是最佳候选人:

ALTER AUTHORIZATION ON DATABASE::[<dbanme>] TO sa;

有趣的是,数据库可能看起来非常健康;表可用,您可以运行选择,更新,删除,创建和删除表等。只有某些组件需要EXECUTE AS

  • 代码签名要求代码具有EXECUTE AS子句
  • 装配验证
  • T-SQL代码中的显式EXECUTE AS
  • Service Broker消息传递(包括查询通知)

后者是最常见的罪魁祸首,因为突然依赖SqlDependency的应用程序似乎停止工作,或者出现随机问题。本文解释了SqlDependency最终如何依赖于EXECUTE AS:The Mysterious Notification