SQL Server'dan derleme bırakmadan bir CLR derlemesi nasıl güncelleştirilir


18

Nasıl bırakıp SQL Server (2008 R2) derleme yeniden oluşturmak zorunda kalmadan bir CLR işlevi (veya yordam) derleme dll güncelleştirebilirim?

Bir montaj (örneğin yeni bir işlev eklemek için) güncellerseniz şimdi duruyor gibi, SQL Server, derleme bırakılana kadar güncelleştirilmiş dll onur olmaz:

DROP ASSEMBLY CLRFunctions

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

Ama montajı bırakmadan önce, ilk olarak referans veren tüm fonksiyonları bırakmalıyım :

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

Ve sonra montajı bırakabilirim:

DROP ASSEMBLY CLRFunctions

Şimdi meclisi " oluşturmak " zorunda:

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

Ve şimdi ben tüm UDF en Bunun beyanı avlamak zorunda edildi i, silinmeden önce kayıtlı.

yerine bir derleme güncelleştirmek ve SQL Server kullanmaya başlar.


Güncelleme : rastgele DBCC FREEPROCCACHEbir "yeniden derleme" zorlamaya çalıştı , ancak SQL Server hala eski kodu kullanır.

Güncelleme : derleme dll sildim CLRFunctions.dllve SQL Server hala (imkansız olması gereken kod olmadan) kodu çalıştırmak mümkün.

Yanıtlar:


16

Bence aradığınızı alter assembly. BOL'dan:

FROM yan tümcesi belirtilirse, ALTER ASSEMBLY montajı sağlanan modüllerin en son kopyalarına göre günceller. SQL Server örneğinde CLR işlevleri, saklı yordamlar, tetikleyiciler, veri türleri ve kullanıcı tanımlı toplama işlevleri olabileceğinden, ALTER ASSEMBLY deyimi bunları derlemenin en son uygulamasına yeniden hatırlatır. Bu yeniden bağlama işlemini gerçekleştirmek için, CLR işlevleriyle, saklı yordamlarla ve tetikleyicilerle eşleşen yöntemlerin, değiştirilmiş derlemede aynı imzalarla var olması gerekir. CLR kullanıcı tanımlı türleri ve kullanıcı tanımlı toplama işlevlerini uygulayan sınıflar, yine de kullanıcı tanımlı tür veya toplama olma gereksinimlerini karşılamalıdır.

Aynı sayfadaki örneklerden biri hile yapacak gibi görünüyor:

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
Güncellenen derleme SQL Server ana makine yerine SSMS istemci makinesinde bulunduğunda yapılabilir mi? Sunucuda dosya sistemine doğrudan erişmek için yeterli ayrıcalığım yok, ancak CLR derlemeleri eklemek ve kaldırmak için yeterli haklara sahibim.
Zarepheth

Hayır. Bir UNC yolu (yani \\ sunucu \ yol \ - \ dosya) belirtebilirsiniz ve SQL motorunun altında çalıştığı hizmet hesabının dosya üzerinde okuma izinleri olduğu sürece, çalışması gerekir. Diğer seçenek, montaj için ikili değeri belirtmektir. Zaten başka bir sunucuda konuşlandırdıysanız, değiştirmeyi oradan komut dosyası yazmak blob değerini alır.
Ben Thul

Evet, ben de öyle düşünmüştüm. :( Belki de daha yeni bir SSMS sürümü, uzak bir makineden derlemelerin güncellenmesine izin verecektir Bu arada, sanırım SSMS GUI aracılığıyla derlemeleri bırakıp oluşturuyorum - ve tüm bağımlı işlevler için DROP ve CREATE işlemlerini gerçekleştiriyorum
Zarepheth

Nefesini tutmazdım. Düşmek ve yeniden yaratmak zorunda kalmaya gelince, neden yukarıda belirtilen yöntemlerden herhangi birini uygulayamıyorsunuz?
Ben Thul

1
"Derleme ekleme ve değiştirme bir dosya sistemi başvurusu gerektirir." - Bu doğru değil. Her ikisi de CREATE ASSEMBLYve ALTER ASSEMBLYmontajı temsil eden bir damla alacak. 2008+ üzerinde oluşturulan herhangi bir veritabanına giderek bunu kendiniz kanıtlayın ve Programlanabilirlik -> Montajlar bölümüne gidin ve Microsoft.SqlServer.Types derlemesinin oluşturulmasını komut dosyası haline getirin. Bu devasa varbinary meclistir . Bu durumunuz için geçerli olduğundan, derlemenizi yerel örneğinize dağıtın, komut dizisini yazın ve bir ALTER ASSEMBLYkomut dosyası yapın.
Ben Thul

7

Ben Thul'un cevabına eklemek için bu, SQL Server Management Studio'nun GUI'si ile uzaktan oldukça kolay bir şekilde gerçekleştirilebilir .

  1. Veritabanınız için Nesne Gezgini -> Programlanabilirlik altında, Montajlar'a sağ tıklayın ve 'Yeni Montaj ...' seçeneğini seçin.

  2. Güncel DLL'inize göz atın.

  3. 'Tamam'ı tıklamak yerine (aynı adda bir montaj zaten mevcut olduğundan başarısız olur) Yeni Montaj penceresinin üstündeki' Komut Dosyası'nı tıklayın.
     
    'MONTAJ OLUŞTUR' satırını ve ardından seçtiğiniz DLL olan büyük bir blob içeren bir SQL Sorgusu'na bırakılırsınız.

  4. 'CREATE' öğesini 'ALTER' olarak değiştirin ve çalıştırın!

Script ayrıca yürütmeden önce kaldırmam gereken bir 'YETKİ' satırı oluşturdu; milajınız değişebilir.

Umarım bu, sunucularına dosya sistemi erişimi olmayan başka birine yardımcı olur.

Umarım Microsoft bunu bir gün SSMS'de birinci sınıf bir işlem yapar, ancak bu, yapana kadar oldukça kolay bir çözümdür.


1

Stackoverflow cevap bir ipucu buldum :

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

1
Sen demek ALTER ASSEMBLY(... UPDATEDML içinde olabilir, ALTER. DDL olan)
miroxlav
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.