SQLCLR tarafından kullanılan AppDomain sıfırlamak için zorlamak istiyorum. SQL Server örneğini yeniden başlatmanın yanı sıra bunu nasıl yapabilirim?
SQLCLR tarafından kullanılan AppDomain sıfırlamak için zorlamak istiyorum. SQL Server örneğini yeniden başlatmanın yanı sıra bunu nasıl yapabilirim?
Yanıtlar:
Bunun biraz acımasız olduğunu biliyorum, ama CLR'yi devre dışı bırakıp yeniden etkinleştirmeye ne dersiniz?
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
ALTER ASSEMBLY
Uygulama etki alanını yeniden yüklemeyen (veya en azından boşaltma) olmayan günlük gönderimi yoluyla yayılanın hata olduğunu söylüyordum . Her iki durumda da, cevabımı buraya eklediğim daha kolay bir yöntem buldum. Açıkladığınız günlük nakliye senaryosunda çalışıp çalışmadığını görmek için çok merak ediyorum, bu yeni yöntemi test etme yeteneğiniz varsa.
Diğer tüm derlemeleri etkilemeyecek daha zarif bir çözüm var: Uygulama etki alanındaki derlemelerden birinin PERMISSION_SET'ini değiştirin (uygulama alanları kullanıcı başınadır).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
PERMISSION_SET değerini eski haline döndürmeniz gerektiğini unutmayın. Ayrıca, PERMISSION_SET değiştirmeden önce derlemedeki bir yönteme erişmeniz gerekir; şu anda etkin olan bir uygulama etki alanına yüklenmemiş ancak başka bir derlemeyle birlikte bir derlemenin uygulama etki alanı üzerinde hiçbir etkisi yoktur (Uygulama Etki Alanları, Derleme başına değil, Kullanıcı Başına DB'dir, Kullanıcı Başınadır).
GÜNCELLEME
Yukarıda açıklanan yöntem, yalnızca bir Uygulama Alanını kaldıracağı en ince yaklaşımdır. Ancak, montajın diğer iki seviyeden birine ayarlanabilmesi gerekir. İşaretli montajlar SAFE
için ancak
TRUSTWORTHY ON
, veyaEXTERNAL ACCESS ASSEMBLY
veya UNSAFE ASSEMBLY
izinBu durumda, TRUSTWORTHY
ayarı basitçe ON
döndürebilir OFF
ve hemen geri dönebilirsiniz ; bu, söz konusu veritabanındaki tüm Uygulama Alanlarını kaldırır:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Yine de veritabanında yalnızca bir Uygulama Etki Alanı varsa (ve bunun zamanın% 95'i veya daha fazlası olduğundan şüpheleniyorsanız), burada açıklanan yöntemlerin her ikisi de aynı net etkiye sahiptir. Ve bu durumda, ALTER DATABASE
yöntem , belirli bir nesne adı belirtmeyi gerektirmediği veya orijinalin ne olduğunu bilmeyi gerektirmediği için daha basit görünüyor PERMISSION_SET
.
AYRICA, yalnızca tek bir Uygulama Etki Alanınız varsa, ALTER DATABASE
veritabanının önceden ayarlanmış olması durumunda TRUSTWORTHY ON
veya anahtar tabanlı oturum açmayı uygun izinle ayarlamış olsanız bile yöntem daha basittir . Eğer bir anahtar tabanlı giriş kullanıyorsanız o zaman ayarlayabilirsiniz TRUSTWORTHY
için ON
ve daha sonra OFF
tekrar yukarıda belirtilen. Ancak, zaten TRUSTWORTHY
ayarladıysanız ON
, tersine çevirin ve OFF
hemen ve sonra hemen geri ayarlayın ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Tatlı.