CREATE ASSEMBLY не прошла проверку: недостаточно места для выполнения этой операции - PullRequest
1 голос
/ 03 июня 2010

У меня есть небольшое приложение, которое использует SQL Server 2005 Express с хранимыми процедурами CLR. Он был успешно установлен и работает на многих компьютерах под управлением XP и Vista.

Для создания сборки выполняется следующий SQL (имена изменены для защиты невинных):

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

На одном компьютере (тестовом компьютере, который отображает другие компьютеры, предназначенные для установки) под управлением Vista и с некоторыми очень агрессивными ограничениями политики безопасности, я получаю следующую ошибку:

Сообщение 6218, уровень 16, состояние 2, домен сервера \ имя_сервера, строка 2
СОЗДАТЬ СБОРКУ для сборки «myAssembly» не удалось, поскольку сборка «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 вызвать это?

У меня нет доступа к компьютеру (клиент проводит тестирование), поэтому я сам не могу осмотреть коробку.

* * ТИА тысяча сорок-девять

1 Ответ

1 голос
/ 17 августа 2015

Если этот код работает как SAFE на других серверах, то я сначала проверю, чтобы убедиться, что .NET установлен в правильной версии (включая обновления).Также может быть проблема с одной из DLL-библиотек .NET, которую необходимо исправить.

Относительно следующего сообщения об ошибке:

Недостаточно памяти длязавершите эту операцию.

, которая на самом деле является ошибкой «недостаточно памяти» (code = ERROR_OUTOFMEMORY): либо недостаточно, либо нет разрешения (каким-либо образом) на ее использование, либо нет доступных дескрипторов файлаи т. д.

Другие упоминания об этой ошибке:

Так что, если эта проблема действительно связана с памятью, то она, вероятно, будет связана с:

  • Сколько физическогопамять на сервере
  • Какая версия SQL Server (изменения были внесены начиная с SQL Server 2012).Этот вопрос касался SQL Server 2005, но с этим могут столкнуться и другие пользователи.В 32-битном SQL Server 2005 домены приложений SQL CLR управляются в области «MemToLeave», которая невелика (см. Ссылку ниже)
  • Это 32-битный или 64-битный SQL Server?Если 32-битный SQL Server работает на 32-битной или 64-битной Windows?
  • Если 32-битный SQL Server на 32-битном, используется ли переключатель /3GB?
  • Вот некоторые ресурсы, чтобы узнать больше о SQL Server и памяти:

Если конфигурация сервера с ошибкой такая же, как и у машин, которые не получают ошибку:

  • тот же объем памяти
  • тот же 32-разрядный или64-разрядная ОС
  • те же 32-разрядные и 64-разрядные SQL Server
  • те же параметры памяти для SQL Server
  • те же программы, не относящиеся к SQL Server, работающие в ОС
  • тот же объем свободного места на диске, который можно использовать для виртуальной памяти и т. Д.)
  • и т. Д.

тогда, если безопасностьНастройка компьютера, который не работает, отличается, необходимо проверить учетную запись «Вход в систему» ​​для службы SQL Server NT.Это локальная системная учетная запись?Это локальный логин?Это логин домена?Если проблема связана с настройкой безопасности, то именно здесь я бы начал искать.Если служба использует локальную системную учетную запись, попробуйте использовать локальную или доменную учетную запись (что в любом случае лучше).Если логин уже является локальным или доменным пользователем, проверьте, как политики безопасности влияют на этого пользователя и на любые группы Windows, членом которых является логин.

...