Как я могу обновить сборку 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 все еще может выполнять код (без кода, который должен быть невозможным).
источник
CREATE ASSEMBLY
иALTER ASSEMBLY
возьмут блоб, представляющий сборку. Докажите это самим, перейдя в любую базу данных, созданную в 2008+, и перейдите в Программируемость -> Сборки и выполните сценарий создания сборки Microsoft.SqlServer.Types. Этот гигантский varbinary - это сборка . Поскольку это применимо к вашей ситуации, разверните вашу сборку в локальном экземпляре, запишите ее и сделайте ееALTER ASSEMBLY
сценарием.Чтобы добавить ответ Бен Тула, это можно сделать довольно легко удаленно через графический интерфейс SQL Server Management Studio .
Под Обозревателем объектов для вашей базы данных -> Программируемость, щелкните правой кнопкой мыши на Сборках и выберите «Новая сборка ...».
Перейдите к обновленной DLL.
Вместо нажатия «ОК» (что не удастся, поскольку сборка с таким именем уже существует), нажмите «Сценарий» в верхней части окна «Новая сборка».
Вы попадете в SQL-запрос, который содержит строку «CREATE ASSEMBLY», за которой следует огромный BLOB-объект - DLL, которую вы только что выбрали.
Измените «CREATE» на «ALTER» и затем выполните!
Скрипт также создал для меня строку «АВТОРИЗАЦИЯ», которую мне пришлось удалить перед выполнением; Ваш пробег может варьироваться.
Я надеюсь, что это поможет кому-то еще без доступа файловой системы к своим серверам.
Надеюсь, Microsoft когда-нибудь сделает это первоклассной операцией в SSMS, но это довольно простой обходной путь, пока они этого не сделают.
источник
я нашел подсказку в ответе на Stackoverflow :
источник
ALTER ASSEMBLY
... (UPDATE
в DML,ALTER
в DDL.)