CREATE ASSEMBLY验证失败:没有足够的存储空间来完成此操作

时间:2010-06-03 15:40:09

标签: sql-server assemblies verification sqlclr

我有一个小应用程序,它使用带有CLR存储过程的SQL Server 2005 Express。它已成功安装并运行在运行XP和Vista的许多计算机上。

要创建程序集,执行以下SQL(更改名称以保护无辜者):

CREATE ASSEMBLY myAssemblyName FROM 'C:\PathToAssembly\myAssembly.dll

在运行Vista并且具有一些非常积极的安全策略限制的一台计算机(反映其他安装计算机的测试计算机)上,我收到以下错误:

  

消息6218,级别16,状态2,服务器域\ servername,行2   程序集“myAssembly”的CREATE ASSEMBLY失败,因为程序集“myAssembly”验证失败。检查引用的程序集是否是最新的并且在数据库中是否可信(对于external_access或unsafe)。 CLR Verifier错误消息(如果有的话)将跟随此消息

     

[:myProcSupport.Axis :: Proc1] [mdToken = 0x6000004] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc2] [mdToken = 0x6000005] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc3] [mdToken = 0x6000006] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis ::。ctor] [mdToken = 0x600000a] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc4] [mdToken = 0x6000001] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc5] [mdToken = 0x6000002] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc6] [mdToken = 0x6000007] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc7] [mdToken = 0x6000008] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc8] [mdToken = 0x6000009] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc8] [mdToken = 0x600000b] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作。

     

[:myProcSupport.Axis :: Proc9] [mdToken = 0x600000c] [HRESULT 0x8007000E] - 没有足够的存储空间来完成此操作....

C#DLL定义为SAFE,因为它只使用数据库中包含的数据。 DLL通常没有签名,但我提供了一个签名版本来测试并收到相同的结果。

安装由其他人完成,我无法访问该框,但他们正在执行我提供的脚本并在其他计算机上工作。

我试图找到有关此错误的信息,超出了脚本提供的结果,但我没有找到任何有用的信息。

执行脚本以创建程序集的人使用管理员帐户登录,以管理员身份运行CMD,通过Windows身份验证连接到数据库,已添加到dbo_owner角色,并添加到服务器角色SysAdmin希望这是一个权限问题。这没有任何改变。

我是否需要针对此环境以不同方式配置SQL Server 2005 Express?

除了SQLCMD的输出之外,是否记录了此错误?什么可能导致此错误? Vista的安全策略会导致这种情况吗?

我无法访问计算机(客户正在进行测试)因此我无法自行检查该框。

TIA

1 个答案:

答案 0 :(得分:1)

如果此代码在其他服务器上用作SAFE,那么我首先检查以确保.NET安装到正确的版本(包括更新)。也可能是其中一个.NET DLL存在问题,需要修复它。

关于以下错误消息:

  

没有足够的存储空间来完成此操作。

实际上是“内存不足”错误(代码= ERROR_OUTOFMEMORY):要么没有足够的OR或者没有权限(以某种方式)使用它,要么没有可用的文件句柄等。

其他提及此错误:

因此,如果此问题确实与内存有关,则可能与以下内容有关:

  • 服务器中有多少物理内存
  • SQL Server的版本(从SQL Server 2012开始进行了更改)。这个问题考虑了SQL Server 2005,但其他人可能会遇到不同版本的人。在32位SQL Server 2005中,SQL CLR AppDomains在“MemToLeave”区域中管理,这个区域并不大(请参阅下面的链接)
  • 这是32位还是64位SQL Server?如果是32位SQL Server,它是在32位还是64位Windows上运行?
  • 如果是32位的32位SQL Server,是否正在使用/3GB开关?
  • 以下是一些资源,可以了解有关SQL Server和内存的更多信息:

如果带有错误的服务器的配置与未收到错误的计算机相同:

  • 相同数量的记忆
  • 相同的32位与64位操作系统
  • 相同的32位与64位SQL Server
  • SQL Server的相同内存设置
  • 在操作系统上运行的相同非SQL Server程序
  • 可用于虚拟内存的相同数量的磁盘可用空间等)
  • 等...

然后,如果不工作的计算机的安全设置不同,则需要检查SQL Server NT服务的“登录身份”帐户。它是本地系统帐户吗?这是本地登录吗?是域登录吗?如果问题与安全设置有关,那么这就是我要开始寻找的地方。如果服务使用的是本地系统帐户,请尝试使用本地或域登录(无论如何,这是一种更好的做法)。如果登录已经是本地用户或域用户,请检查安全策略如何影响该用户该登录所属的任何Windows组。