Назад | Перейти на главную страницу

Как обновить сборку CLR без удаления сборки с SQL Server

Как я могу обновить dll сборки функции (или процедуры) CLR без необходимости отбрасывать и повторно создавать сборку в SQL Server (2008 R2)?

В нынешнем виде, если я обновляю сборку (например, для добавления новой функции), SQL Server не будет учитывать обновленную dll, пока я не удалю сборку:

DROP ASSEMBLY CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

Но прежде чем я смогу сбросить сборку, я должен сначала сбросить все функции которые ссылаются на это:

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

И затем я могу уронить сборку:

DROP ASSEMBLY CLRFunctions

Теперь мне нужно "Создайте" Ассамблея:

CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

И теперь я должен искать объявления всех UDF, которые мы зарегистрировались до того, как я их удалил.

Я бы лучше Обновить сборку, и пусть SQL Server начнет ее использовать.


Обновить: я случайно попробовал DBCC FREEPROCCACHE для принудительной «перекомпиляции», но SQL Server по-прежнему использует старый код.

Обновить: удалил сборку dll CLRFunctions.dll, и SQL Server по-прежнему может выполнять код (без кода это должно быть невозможно).

Я думаю ты ищешь alter assembly. Из BOL:

Если указано предложение FROM, ALTER ASSEMBLY обновляет сборку с учетом последних копий предоставленных модулей. Поскольку в экземпляре SQL Server могут быть функции CLR, хранимые процедуры, триггеры, типы данных и определяемые пользователем агрегатные функции, которые уже определены для сборки, оператор ALTER ASSEMBLY повторно связывает их с последней реализацией сборки. Для выполнения этой повторной привязки методы, которые сопоставляются с функциями CLR, хранимыми процедурами и триггерами, должны по-прежнему существовать в измененной сборке с теми же сигнатурами. Классы, реализующие определяемые пользователем типы среды CLR и определяемые пользователем агрегатные функции, должны по-прежнему удовлетворять требованиям для того, чтобы быть определяемым пользователем типом или агрегатом.

Похоже, что один из примеров на той же странице поможет:

ALTER ASSEMBLY ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 

Чтобы добавить к ответу Бена Тула, это можно довольно легко выполнить удаленно. через графический интерфейс SQL Server Management Studio.

  1. В обозревателе объектов для вашей базы данных -> Программирование, щелкните правой кнопкой мыши "Сборки" и выберите "Новая сборка ...".

  2. Перейдите к обновленной DLL.

  3. Вместо того, чтобы нажимать «ОК» (что не удастся, поскольку сборка с таким же именем уже существует), нажмите «Сценарий» в верхней части окна «Новая сборка».
     
    Вы попадете в SQL-запрос, который включает строку «CREATE ASSEMBLY», за которой следует огромный BLOB-объект, который представляет собой только что выбранную DLL.

  4. Измените «CREATE» на «ALTER», а затем выполните!

Скрипт также создал для меня строку «АВТОРИЗАЦИЯ», которую мне пришлось удалить перед выполнением; ваш пробег может отличаться.

Я надеюсь, что это поможет кому-то еще без доступа файловой системы к своим серверам.

Надеюсь, что когда-нибудь Microsoft сделает эту операцию в SSMS первоклассной, но пока она не сделает этого, это будет довольно простой обходной путь.

я нашел намек на ответ на Переполнение стека:

ALTER ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';