Tôi muốn buộc AppDomain đang được SQLCLR sử dụng để được đặt lại. Làm thế nào tôi có thể làm điều đó ngoài việc khởi động lại phiên bản SQL Server?
Tôi muốn buộc AppDomain đang được SQLCLR sử dụng để được đặt lại. Làm thế nào tôi có thể làm điều đó ngoài việc khởi động lại phiên bản SQL Server?
Câu trả lời:
Tôi biết điều này hơi tàn bạo, nhưng còn việc vô hiệu hóa CLR và kích hoạt lại thì sao?
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
truyền bá thông qua vận chuyển nhật ký không tải lại (hoặc ít nhất là không tải) Miền ứng dụng là lỗi. Dù bằng cách nào, tôi đã tìm thấy một phương pháp thậm chí còn dễ dàng hơn mà tôi đã thêm vào câu trả lời của mình ở đây. Nếu bạn có khả năng thử nghiệm phương pháp mới này sẽ rất tuyệt vì tôi rất tò mò muốn xem liệu nó có hoạt động trong kịch bản vận chuyển nhật ký mà bạn mô tả hay không.
Có một giải pháp tinh tế hơn sẽ không ảnh hưởng đến tất cả các hội đồng khác: chỉ cần thay đổi PERMISSION_SET của một trong các hội đồng trong miền ứng dụng (miền ứng dụng là cho mỗi người dùng).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
Chỉ cần nhớ rằng bạn sẽ cần đặt PERMISSION_SET trở lại như cũ. Ngoài ra, bạn cần truy cập một phương thức trong cụm trước khi thay đổi PERMISSION_SET sẽ hủy tải nó; thay đổi một hội đồng hiện không được tải vào một miền ứng dụng đang hoạt động, nhưng với một hội đồng khác, không có tác dụng đối với miền ứng dụng (Miền ứng dụng là mỗi DB, mỗi người dùng, không phải mỗi hội đồng).
CẬP NHẬT
Phương pháp được mô tả ở trên là cách tiếp cận chi tiết nhất, nơi nó sẽ chỉ dỡ bỏ một Miền ứng dụng đó. Nhưng, nó yêu cầu lắp ráp có thể được đặt thành một trong hai cấp độ khác. Đối với các hội đồng được đánh dấu là SAFE
nó sẽ chỉ có thể nếu một trong hai
TRUSTWORTHY ON
, hoặcEXTERNAL ACCESS ASSEMBLY
hoặc UNSAFE ASSEMBLY
cho phépTrong trường hợp này, bạn có thể chỉ cần xoay TRUSTWORTHY
cài đặt ON
và sau đó quay lại ngay lập tức OFF
và điều đó sẽ hủy tất cả các Miền ứng dụng trong cơ sở dữ liệu cụ thể đó:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Nếu bạn chỉ có một Miền ứng dụng trong cơ sở dữ liệu (và tôi nghi ngờ đây là trường hợp 95% hoặc hơn), thì cả hai phương pháp được mô tả ở đây đều có cùng hiệu quả. Và trong tình huống đó, ALTER DATABASE
phương thức có vẻ đơn giản hơn vì nó không yêu cầu chỉ định một tên đối tượng cụ thể cũng như không yêu cầu phải biết bản gốc PERMISSION_SET
là gì.
CSONG, nếu bạn chỉ có một Miền ứng dụng duy nhất thì ALTER DATABASE
phương thức sẽ đơn giản hơn ngay cả trong trường hợp cơ sở dữ liệu đã được đặt thành TRUSTWORTHY ON
hoặc bạn đã thiết lập đăng nhập cơ sở khóa với sự cho phép thích hợp. Nếu bạn đang sử dụng thông tin đăng nhập dựa trên khóa thì bạn có thể đặt TRUSTWORTHY
lại ON
và sau đó OFF
như đã đề cập ở trên. Nhưng nếu bạn đã TRUSTWORTHY
thiết lập ON
, thì chỉ cần đảo ngược nó và đặt thành OFF
rồi quay lại ngay ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Ngọt.