Ngoài việc khởi động lại SQL Server, có cách nào để buộc SQLCLR AppDomain được đặt lại không?


11

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?


Không chắc chắn nếu bạn nhận được thông báo về cập nhật câu trả lời, nhưng tôi đã cập nhật câu trả lời của mình bằng một phương pháp thậm chí còn dễ dàng hơn :).
Solomon Rutzky 6/2/2015

Câu trả lời:


6

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

2
Một chi tiết quan trọng về phương pháp này là nó hoạt động khi được thực thi đối với cơ sở dữ liệu STANDBY (chỉ đọc); tất cả các phương pháp khác tôi đã thử không. Tôi cần điều này bởi vì một bản cập nhật cho một hội đồng CLR được truyền bá như bình thường thông qua vận chuyển nhật ký đến một danh mục STANDBY, nhưng AppDomain không tải lại --- vì vậy nó tiếp tục chạy mã từ phiên bản cũ của dll trong khoảng một ngày.
Granger

@Granger rất thú vị và tốt để biết :). Tuy nhiên, tôi sẽ xem xét rằng một lỗi trong SQL Server. Bạn có thể muốn báo cáo điều đó thông qua trang web Connect: connect.microsoft.com/QueryServer/Feedback
Solomon Rutzky

1
@srutzky - Cảm ơn lời đề nghị; Tôi hy vọng họ sẽ đóng báo cáo là "Không sửa". Cài đặt này toàn máy chủ, không phải trên mỗi danh mục (giống như 'kích hoạt lồng nhau', 'cấp độ truy cập filestream', v.v.). Đó hoàn toàn là những con giun tôi đang cố mở.
Granger

@Granger (và Max): Tôi không rõ về những gì tôi đã nói tôi nghĩ là một lỗi. Tôi không nói rằng việc đặt lại cài đặt "Đã bật CLR" gây ra việc dỡ tải là một lỗi. Tôi đã nói rằng việc ALTER ASSEMBLYtruyề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.
Solomon Rutzky 6/2/2015

8

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à SAFEnó sẽ chỉ có thể nếu một trong hai

  • cơ sở dữ liệu được đặt thành TRUSTWORTHY ON, hoặc
  • lắp ráp được ký và Đăng nhập, dựa trên khóa bất đối xứng, chính nó dựa trên cùng một chữ ký với lắp ráp, tồn tại và đã được cấp EXTERNAL ACCESS ASSEMBLYhoặc UNSAFE ASSEMBLYcho phép

Trong trường hợp này, bạn có thể chỉ cần xoay TRUSTWORTHYcài đặt ONvà sau đó quay lại ngay lập tức OFFvà đ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 DATABASEphươ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_SETlà gì.

CSONG, nếu bạn chỉ có một Miền ứng dụng duy nhất thì ALTER DATABASEphươ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 ONhoặ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 TRUSTWORTHYlại ONvà sau đó OFFnhư đã đề cập ở trên. Nhưng nếu bạn đã TRUSTWORTHYthiết lập ON, thì chỉ cần đảo ngược nó và đặt thành OFFrồi quay lại ngay ON:

ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;

1
Phương pháp cập nhật hoạt động trên danh mục cơ sở dữ liệu STANDBY (READ_ONLY). Máy chủ Sql cho phép tôi thay đổi cài đặt "TRUSTWORTHY", sau đó khôi phục lại cài đặt trước đó. Tôi đã xác minh rằng thay đổi thực sự đã dỡ tải tên miền bằng cách xem kết quả từ đó SELECT * FROM sys.dm_clr_appdomains;. Ngọt.
Granger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.