Мы используем блок с некоторыми определяемыми пользователем функциями в нашей установке 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, как я подозреваю, что многим, кто испытывает те же проблемы, поможет больше всего его ответ.
Это не связано с тем, что он 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
Текстовые файлы Mac обычно заканчиваются на \r
, но это можно узнать, используя шестнадцатеричный редактор и увидев, на чем заканчиваются строки.
Продолжительность выполнения является кошмаром составителей компилятора. Так что считаю вредным.
-121--2271295-Можно попытаться загрузить сборку из файла. Я не уверен, можно ли развернуть сборку, закодированную на 32-разрядной версии, на 64-разрядный SQL Server, используя синтаксис закодированной строки.