Как я могу обновить 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.
В обозревателе объектов для вашей базы данных -> Программирование, щелкните правой кнопкой мыши "Сборки" и выберите "Новая сборка ...".
Перейдите к обновленной DLL.
Вместо того, чтобы нажимать «ОК» (что не удастся, поскольку сборка с таким же именем уже существует), нажмите «Сценарий» в верхней части окна «Новая сборка».
Вы попадете в SQL-запрос, который включает строку «CREATE ASSEMBLY», за которой следует огромный BLOB-объект, который представляет собой только что выбранную DLL.
Измените «CREATE» на «ALTER», а затем выполните!
Скрипт также создал для меня строку «АВТОРИЗАЦИЯ», которую мне пришлось удалить перед выполнением; ваш пробег может отличаться.
Я надеюсь, что это поможет кому-то еще без доступа файловой системы к своим серверам.
Надеюсь, что когда-нибудь Microsoft сделает эту операцию в SSMS первоклассной, но пока она не сделает этого, это будет довольно простой обходной путь.
я нашел намек на ответ на Переполнение стека:
ALTER ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';