1

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

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

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

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

消息 6218,级别 16,状态 2,服务器域\服务器名称,第 2
行为程序集“myAssembly”创建程序集失败,因为程序集“myAssembly”验证失败。检查引用的程序集是否是最新的并且受信任(对于 external_access 或不安全)以在数据库中执行。如果有任何 CLR 验证程序错误消息将跟随此消息

[ : 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

4

1 回答 1

1

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

关于以下错误信息:

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

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

此错误的其他提及:

所以如果这个问题真的与内存有关,那么它很可能与:

  • 服务器中有多少物理内存
  • 什么版本的 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 程序
  • 可用于虚拟内存等的相同数量的磁盘可用空间)
  • ETC....

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

于 2015-08-16T22:10:01.383 回答