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 ASSEMBLYUygulama 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 SAFEiçin ancak
TRUSTWORTHY ON, veyaEXTERNAL ACCESS ASSEMBLYveya UNSAFE ASSEMBLYizinBu durumda, TRUSTWORTHYayarı basitçe ONdöndürebilir OFFve 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 DATABASEyö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 DATABASEveritabanının önceden ayarlanmış olması durumunda TRUSTWORTHY ONveya 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 TRUSTWORTHYiçin ONve daha sonra OFFtekrar yukarıda belirtilen. Ancak, zaten TRUSTWORTHYayarladıysanız ON, tersine çevirin ve OFFhemen 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ı.