Як оновити збірку CLR без скидання збірки з SQL Server


18

Як я можу оновити функцію CLR (або процедуру) збирання dll без необхідності скидати та заново створювати збірку в 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';

І тепер мені потрібно полювати на декларацію всіх ОДС, які були зареєстровані до того, як я їх видалив.

Я б скоріше оновив збірку, і SQL Server почав би її використовувати.


Оновлення : я випадковим чином намагався DBCC FREEPROCCACHEпримусити "перекомпілювати", але SQL Server все ще використовує старий код.

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

Відповіді:


16

Я думаю, ти шукаєш alter assembly. Від BOL:

Якщо вказано пункт FROM, ALTER ASSEMBLY оновлює збірку стосовно останніх копій наданих модулів. Оскільки можуть бути функції CLR, збережені процедури, тригери, типи даних та визначені користувачем функції сукупності в екземплярі SQL Server, які вже визначені проти складання, оператор 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' 

1
Чи можна це зробити, коли оновлена ​​збірка розташована на клієнтській машині SSMS, а не на хост-сервері SQL Server? У мене немає достатніх привілеїв на сервері для прямого доступу до його файлової системи, але я маю достатньо прав на додавання та видалення збірок CLR.
Зарефет

Ні. В основному ні. Ви можете вказати шлях до UNC (тобто \\ сервер \ шлях \ до \ файл) і доки обліковий запис служби, під яким працює двигун SQL, має дозволи на читання файлу, він повинен працювати. Інший варіант - вказати бінарне значення для складання. Якщо ви вже розгорнули його на іншому сервері, сценарій зміни звідти отримає вам значення крапки.
Бен Тул

Так, це я подумав. :( Можливо, новіша версія SSMS дозволить оновити збірки з віддаленої машини. Тим часом, я думаю, я скидаю і створюю збірки через GUI SSMS - і виконую операції DROP і CREATE для всіх залежних функцій.
Zarepheth

Я не затримав би дихання на цьому. Що стосується того, що вам доведеться кинути і відтворити, чому ви не можете застосувати жоден із способів, описаних вище?
Бен Тул

1
"Для додавання та зміни збірок потрібна посилання на файлову систему." - це не правда. І те CREATE ASSEMBLYі ALTER ASSEMBLYінше візьмемо крапку, яка представляє збірку. Доведіть це собі, перейшовши в будь-яку базу даних, створену на 2008 рік і перейдіть до програмируемости -> Асамблеї та скрипт створення збірки Microsoft.SqlServer.Types. Той гігантський варбінар - це збірка . Оскільки це стосується вашої ситуації, розгорніть збірку в локальний екземпляр, відшліфуйте її та зробіть її ALTER ASSEMBLYсценарієм.
Бен Тул

7

Щоб додати відповідь Бен Тула, це можна зробити досить віддалено досить легко через GUI SQL Server Management Studio .

  1. У розділі Провідник об’єктів для вашої бази даних -> Програмоване, клацніть правою кнопкою миші на Асамблеї та виберіть "Нова збірка ...".

  2. Перейдіть до оновленої DLL.

  3. Замість того, щоб натиснути "ОК" (що не вдасться, оскільки збірка з такою ж назвою вже існує) натисніть "Сценарій" у верхній частині вікна Нової асамблеї.
     
    Ви перейдете на запит SQL, який включає в себе рядок "СТВОРИТИ СКЛАД", за яким слідує величезна крапка, яка є щойно обраною вами DLL.

  4. Змініть "CREATE" на "ALTER" і виконайте!

Сценарій також створив для мене рядок "АВТОРИЗАЦІЯ", який мені довелося видалити перед виконанням; ваш пробіг може змінюватися.

Я сподіваюся, що це допоможе комусь без доступу до файлової системи до своїх серверів.

Сподіваємось, Microsoft колись зробить це першокласною операцією в SSMS, але це досить легке вирішення, поки вони не зроблять це.


1

я знайшов підказку на відповідь на Stackoverflow :

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

1
Ви мали на увазі ALTER ASSEMBLY... ( UPDATEє в DML, ALTERє в DDL.)
miroxlav
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.