我创建了一个具有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_internal
或untrusted assemblies的引用,但在此特定问题上没有任何内容。
重要的部分似乎是
没有足够的存储空间来处理此命令
但是我无法做到这一点,因为有许多GB的内存和大量的驱动器空间可供使用,所以资源不应该成为问题。
任何人都可以了解这个错误指的是什么,理想情况下我可以解决它吗?
答案 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。掌握了这些知识,人们可以很容易地想到可能出现的问题:
MachineA\user
或DomainA\user
)在机器A上发出CREATE DATABASE,然后将数据库复制到机器B(通过备份/恢复或通过文件)复制)。 owner_sid由文件复制以及备份/恢复保留,在机器B上,owner_sid无效。一切都需要EXECUTE As失败,包括从数据库加载程序集。所有这些问题都可以通过在问题db的上下文中运行:EXECUTE AS USER = 'dbo';
来诊断。它失败并出现错误,那么程序集加载问题的原因是dbo
的EXECUTE AS上下文。
解决方案很简单,只需强制owner_sid
有效登录即可。 sa
通常是最佳候选人:
ALTER AUTHORIZATION ON DATABASE::[<dbanme>] TO sa;
有趣的是,数据库可能看起来非常健康;表可用,您可以运行选择,更新,删除,创建和删除表等。只有某些组件需要EXECUTE AS
:
EXECUTE AS
后者是最常见的罪魁祸首,因为突然依赖SqlDependency
的应用程序似乎停止工作,或者出现随机问题。本文解释了SqlDependency
最终如何依赖于EXECUTE AS:The Mysterious Notification