Saya ingin memaksa AppDomain yang digunakan oleh SQLCLR untuk diatur ulang. Bagaimana saya bisa melakukan itu selain memulai kembali contoh SQL Server?
Saya ingin memaksa AppDomain yang digunakan oleh SQLCLR untuk diatur ulang. Bagaimana saya bisa melakukan itu selain memulai kembali contoh SQL Server?
Jawaban:
Saya tahu ini agak brutal, tetapi bagaimana dengan menonaktifkan CLR dan mengaktifkannya kembali?
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
diperbanyak melalui pengiriman log yang tidak memuat ulang (atau setidaknya membongkar) App Domain adalah bug. Either way, saya menemukan metode yang lebih mudah yang saya tambahkan ke jawaban saya di sini. Jika Anda memiliki kemampuan untuk menguji metode baru ini, itu akan menjadi hebat karena saya sangat ingin tahu apakah itu berfungsi dalam skenario pengiriman log yang Anda jelaskan.
Ada solusi yang lebih elegan yang tidak akan memengaruhi semua majelis lain: cukup ubah PERMISSION_SET dari salah satu majelis dalam domain aplikasi (domain aplikasi adalah per pengguna).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
Ingatlah bahwa Anda perlu mengatur PERMISSION_SET kembali ke seperti semula. Selain itu, Anda perlu mengakses metode dalam perakitan sebelum mengubah PERMISSION_SET akan membongkar itu; mengubah rakitan yang saat ini tidak dimuat ke domain aplikasi yang aktif, tetapi dengan rakitan lain, tidak berpengaruh pada domain aplikasi (Domain Aplikasi adalah per-DB, per-Pengguna, bukan per-Majelis).
PEMBARUAN
Metode yang dijelaskan di atas adalah pendekatan yang paling tepat di mana ia hanya akan membongkar satu Domain Aplikasi itu. Tapi, itu memang mengharuskan perakitan dapat diatur ke salah satu dari dua level lainnya. Untuk majelis yang ditandai karena SAFE
hanya akan dimungkinkan jika salah satunya
TRUSTWORTHY ON
, atauEXTERNAL ACCESS ASSEMBLY
atau UNSAFE ASSEMBLY
izinDalam hal ini Anda dapat dengan mudah mengubah TRUSTWORTHY
pengaturan ON
dan kemudian segera kembali OFF
lagi dan itu akan membongkar semua Domain Aplikasi dalam database tertentu:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Jika Anda hanya memiliki satu App Domain dalam basis data (dan saya kira ini adalah kasus 95%, atau lebih, pada saat itu), maka kedua metode yang dijelaskan di sini memiliki efek bersih yang sama. Dan dalam situasi itu, ALTER DATABASE
metode ini tampak lebih sederhana karena tidak memerlukan menentukan nama objek tertentu juga tidak perlu mengetahui apa yang asli PERMISSION_SET
.
JUGA, jika Anda hanya memiliki satu App Domain maka ALTER DATABASE
metodenya lebih sederhana bahkan dalam kasus di mana database sudah diatur TRUSTWORTHY ON
atau Anda telah mengatur login basis-kunci dengan izin yang sesuai. Jika Anda menggunakan login berbasis kunci maka Anda dapat mengatur TRUSTWORTHY
ke ON
dan kemudian OFF
lagi seperti yang disebutkan di atas. Tetapi jika Anda sudah TRUSTWORTHY
menyetel ke ON
, maka balikkan dan atur ke OFF
lalu segera kembali ke ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Manis.