Cách cập nhật hội CLR mà không bỏ hội đồng từ SQL Server


18

Làm cách nào tôi có thể cập nhật dll hàm CLR (hoặc thủ tục) mà không phải bỏ và tạo lại cụm trong SQL Server (2008 R2)?

Vì hiện tại nếu tôi cập nhật một hội đồng (ví dụ để thêm một chức năng mới), SQL Server sẽ không tôn trọng dll được cập nhật cho đến khi tôi bỏ hội đồng:

DROP ASSEMBLY CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

Nhưng trước khi tôi có thể bỏ tập hợp, trước tiên tôi phải bỏ tất cả các hàm tham chiếu đến nó:

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

sau đó tôi có thể thả lắp ráp:

DROP ASSEMBLY CLRFunctions

Bây giờ tôi phải " tạo " lắp ráp:

CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

Và bây giờ tôi phải săn tuyên bố của tất cả các UDF đã được đăng ký trước khi tôi xóa chúng.

Tôi muốn cập nhật một hội đồng và SQL Server bắt đầu sử dụng nó.


Cập nhật : tôi đã cố gắng ngẫu nhiên DBCC FREEPROCCACHEđể buộc "biên dịch lại", nhưng SQL Server vẫn sử dụng mã cũ.

Cập nhật : tôi đã xóa dll lắp ráp CLRFunctions.dllvà SQL Server vẫn có thể chạy mã (không có mã nên không thể).

Câu trả lời:


16

Tôi nghĩ rằng bạn đang tìm kiếm alter assembly. Từ BOL:

Nếu mệnh đề TỪ được chỉ định, ALTER ASSEMBLY cập nhật lắp ráp đối với các bản sao mới nhất của các mô-đun được cung cấp. Vì có thể có các hàm CLR, các thủ tục được lưu trữ, các trình kích hoạt, kiểu dữ liệu và các hàm tổng hợp do người dùng định nghĩa trong trường hợp SQL Server đã được xác định đối với tổ hợp, nên câu lệnh ALTER ASSEMBLY đưa chúng trở lại triển khai mới nhất của hội đồng. Để thực hiện việc đóng lại này, các phương thức ánh xạ tới các hàm CLR, các thủ tục được lưu trữ và các trình kích hoạt vẫn phải tồn tại trong tổ hợp đã sửa đổi có cùng chữ ký. Các lớp thực hiện các loại định nghĩa người dùng CLR và các hàm tổng hợp do người dùng định nghĩa vẫn phải đáp ứng các yêu cầu để trở thành một loại hoặc tổng hợp do người dùng định nghĩa.

Một trong những ví dụ trên cùng một trang có vẻ như nó thực hiện mẹo:

ALTER ASSEMBLY ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 

1
Điều này có thể được thực hiện khi lắp ráp cập nhật được đặt trên máy khách SSMS chứ không phải máy chủ SQL Server không? Tôi không có đủ đặc quyền trên máy chủ để truy cập trực tiếp vào hệ thống tệp của mình, nhưng tôi có đủ quyền để thêm và xóa các cụm CLR.
Zarepheth

Không, chủ yếu là không. Bạn có thể chỉ định đường dẫn UNC (ví dụ: \ server \ path \ to \ file) và miễn là tài khoản dịch vụ mà công cụ SQL đang chạy có quyền đọc trên tệp, nó sẽ hoạt động. Tùy chọn khác là chỉ định giá trị nhị phân cho lắp ráp. Nếu bạn đã triển khai nó trên một máy chủ khác, kịch bản thay đổi từ đó sẽ giúp bạn có được giá trị blob.
Ben Thul

Yeah đó là những gì tôi nghĩ. :( Có lẽ một phiên bản mới hơn của SSMS sẽ cho phép cập nhật lắp ráp từ một máy từ xa Trong khi đó, tôi đoán tôi thả và tạo hội thông qua SSMS GUI -. Và thực hiện thả và CREATE hoạt động cho tất cả các chức năng phụ thuộc.
Zarepheth

Tôi sẽ không nín thở về điều đó. Theo như phải bỏ và tái tạo, tại sao bạn không thể thực hiện một trong các phương pháp được nêu ở trên?
Ben Thul

1
"Việc thêm và thay đổi các cụm yêu cầu tham chiếu hệ thống tệp." - Đây không phải là sự thật. Cả hai CREATE ASSEMBLYALTER ASSEMBLYsẽ có một đốm màu đại diện cho hội. Hãy tự chứng minh điều này bằng cách truy cập vào bất kỳ cơ sở dữ liệu nào được tạo trên 2008+ và đi đến Khả năng lập trình -> Tập hợp và tập lệnh tạo tập hợp Microsoft.SqlServer.Types. Sự khác biệt khổng lồ đó là sự lắp ráp . Vì điều này áp dụng cho tình huống của bạn, hãy triển khai lắp ráp của bạn vào thể hiện cục bộ của bạn, viết kịch bản ra và biến nó thành ALTER ASSEMBLYtập lệnh.
Ben Thul

7

Để thêm vào câu trả lời của Ben Thul, điều này có thể được thực hiện từ xa khá dễ dàng thông qua GUI của SQL Server Management Studio .

  1. Trong Object Explorer cho cơ sở dữ liệu của bạn -> Khả năng lập trình, nhấp chuột phải vào Lắp ráp và chọn 'Hội mới ...'.

  2. Duyệt đến DLL cập nhật của bạn.

  3. Thay vì nhấp vào 'OK' (sẽ thất bại, vì một tập hợp cùng tên đã tồn tại), nhấp vào 'Tập lệnh' ở đầu cửa sổ Hội mới.
     
    Bạn sẽ được thả vào Truy vấn SQL bao gồm dòng 'TẠO LẮP RÁP' theo sau là một đốm lớn đó là DLL bạn vừa chọn.

  4. Thay đổi 'TẠO' thành 'THAY ĐỔI' và sau đó thực thi!

Script cũng tạo ra một dòng 'AUTHORIZATION' cho tôi mà tôi phải xóa trước khi thực hiện; milage của bạn có thể thay đổi.

Tôi hy vọng điều này sẽ giúp người khác mà không cần hệ thống tập tin truy cập vào máy chủ của họ.

Hy vọng rằng Microsoft sẽ biến đây thành một hoạt động hạng nhất trong SSMS một ngày nào đó, nhưng đây là một cách giải quyết khá dễ dàng cho đến khi họ thực hiện.


1

tôi tìm thấy một gợi ý về câu trả lời trên Stackoverflow :

ALTER ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

1
Ý bạn là ALTER ASSEMBLY... ( UPDATElà trong DML, ALTERlà DDL.)
miroxlav
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.