Блок CLR не загрузит в SQL Server на 64 бита 2005

Мы используем блок с некоторыми определяемыми пользователем функциями в нашей установке SQL Server 2005 (32 бита). Мы развертываем это на производстве со сценарием как это:

CREATE ASSEMBLY [Ourfunctions]
AUTHORIZATION [dbo]
FROM 0x4D5A9000...000
WITH PERMISSION_SET = SAFE
GO
CREATE FUNCTION [dbo].[GLOBAL_FormatString](@input [nvarchar](4000))
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [Ourfunctions].[UserDefinedFunctions].[GLOBAL_FormatString]
GO

Мы никогда не испытывали проблем с этими функциями. Теперь, когда мы пытались обновить один из наших серверов к x64, мы получили ошибки при вызывании любой из функций. Демонстрационное отслеживание стека:

Система. Данные. SqlClient. SqlException: ошибка произошла в Microsoft.NET Framework при попытке загрузить идентификатор 65549 блока. Сервер может исчерпывать ресурсы, или блоку нельзя доверить PERMISSION_SET = EXTERNAL_ACCESS или НЕБЕЗОПАСНЫЙ. Выполните запрос снова или проверьте документацию, чтобы видеть, как решить проблемы доверия блока. Для получения дополнительной информации об этой ошибке: Система. IO.FileLoadException: не Мог загрузить файл или блок 'ourfunctions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' или одну из его зависимостей. Данное имя сборки или кодовая база были недопустимы. (Исключение из HRESULT: 0x80131047) Система. IO.FileLoadException: в System. Отражение. Assembly.nLoad (имя файла AssemblyName, Строковая кодовая база, Доказательство assemblySecurity, блок locationHint, StackCrawlMark& stackMark, булевская переменная throwOnFileNotFound, булевская переменная - надрез

Ошибка упоминает наборы полномочий EXTERNAL_ACCESS И UNSAFE тогда как мы используем уровень SAFE.

.dll файл является сборкой с набором целевой платформы к 'Любому ЦП', и мы получаем те же результаты, когда мы пытаемся загрузить dll из файла вместо varbinary синтаксиса. Мы уже попробовали предложения в http://support.microsoft.com/kb/918040

Мы попробовали ту же самую процедуру по машине на 32 бита, и все просто работало. Это должно быть различие между x86 и x64. Какие-либо идеи?

РЕШЕНИЕ: Мы наконец нашли решение. Оказывается, что наш блок был действительно скомпилированным тем на 32 бита. В Visual Studio мы использовали цель "Любой ЦП", но при осмотре базового .csproj, я нашел следующий отрывок:

  
    ...other elements...
    x86
  

Таким образом, наш "Любой ЦП" цель на самом деле создавал x86 блок! Aaargh. Я проследил эту строку в подверсии, но это уже было там при первой регистрации в 2006. Возможно, это было ошибкой в некотором раннем шаблоне проекта базы данных?

Так или иначе, спасибо за Вашу справку. Я приму ответ Russ, как я подозреваю, что многим, кто испытывает те же проблемы, поможет больше всего его ответ.

6
задан Teun D 10 February 2010 в 14:14
поделиться

2 ответа

Это не связано с тем, что он 64-битный, вам нужно измените БД, чтобы разрешить это. Попробуйте следующее:

ALTER DATABASE YOURDATABASEHERE
SET TRUSTWORTHY ON;
GO

если это само по себе не сработает, вы также можете попробовать эти варианты

USE YOURDATABASEHERE
GO
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO 
0
ответ дан 18 December 2019 в 04:52
поделиться

Текстовые файлы Mac обычно заканчиваются на \r , но это можно узнать, используя шестнадцатеричный редактор и увидев, на чем заканчиваются строки.

-121--4690760-

Продолжительность выполнения является кошмаром составителей компилятора. Так что считаю вредным.

-121--2271295-

Можно попытаться загрузить сборку из файла. Я не уверен, можно ли развернуть сборку, закодированную на 32-разрядной версии, на 64-разрядный SQL Server, используя синтаксис закодированной строки.

0
ответ дан 18 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: