SQL Server에서 어셈블리를 삭제하지 않고 CLR 어셈블리를 업데이트하는 방법


18

SQL Server (2008 R2)에서 어셈블리를 삭제하고 다시 만들지 않고 CLR 함수 (또는 프로 시저) 어셈블리 dll을 어떻게 업데이트 할 수 있습니까?

어셈블리를 업데이트하면 (예 : 새 기능 추가) SQL Server는 어셈블리를 삭제할 때까지 업데이트 된 dll을 적용하지 않습니다.

DROP ASSEMBLY CLRFunctions

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

그러나 어셈블리를 삭제하기 전에 먼저 참조하는 모든 함수 를 삭제해야 합니다.

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

그런 다음 어셈블리를 삭제할 수 있습니다.

DROP ASSEMBLY CLRFunctions

이제 어셈블리 를 " 생성 "해야합니다.

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

그리고 지금은 모든 UDF의 그 선언 사냥해야 하고 내가 그들을 삭제하기 전에 등록합니다.

차라리 어셈블리를 업데이트 하고 SQL Server에서 사용을 시작하도록합니다.


업데이트 : 무작위로 DBCC FREEPROCCACHE"재 컴파일"을 강제 로 시도 했지만 SQL Server는 여전히 이전 코드를 사용합니다.

업데이트 : 어셈블리 dll을 삭제했지만 CLRFunctions.dllSQL Server는 여전히 코드를 실행할 수 있습니다 (코드는 불가능해야 함).

답변:


16

찾고 계신 것 같습니다 alter assembly. BOL에서 :

FROM 절이 지정되면 ALTER ASSEMBLY는 제공된 모듈의 최신 사본과 관련하여 어셈블리를 업데이트합니다. 어셈블리에 대해 이미 정의 된 SQL Server 인스턴스에 CLR 함수, 저장 프로 시저, 트리거, 데이터 형식 및 사용자 정의 집계 함수가있을 수 있으므로 ALTER ASSEMBLY 문은이를 최신 어셈블리 구현에 리 바인드합니다. 이 리 바인드를 수행하려면 CLR 함수, 스토어드 프로 시저 및 트리거에 맵핑되는 메소드가 여전히 동일한 서명으로 수정 된 어셈블리에 존재해야합니다. CLR 사용자 정의 형식 및 사용자 정의 집계 함수를 구현하는 클래스는 여전히 사용자 정의 형식 또는 집계에 대한 요구 사항을 충족해야합니다.

같은 페이지의 예제 중 하나가 트릭을 수행하는 것처럼 보입니다.

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
업데이트 된 어셈블리가 SQL Server 호스트 컴퓨터가 아닌 SSMS 클라이언트 컴퓨터에있는 경우이 작업을 수행 할 수 있습니까? 서버에서 파일 시스템에 직접 액세스 할 수있는 충분한 권한이 없지만 CLR 어셈블리를 추가하고 제거 할 수있는 충분한 권한이 있습니다.
Zarepheth

아뇨. UNC 경로 (예 : \\ server \ path \ to \ file)를 지정할 수 있으며 SQL 엔진이 실행되는 서비스 계정에 파일에 대한 읽기 권한이있는 한 작동합니다. 다른 옵션은 어셈블리의 이진 값을 지정하는 것입니다. 다른 서버에 이미 배포 한 경우 변경을 스크립팅하면 blob 값을 얻을 수 있습니다.
벤 툴

그래, 내 생각이야 :( 아마도 최신 버전의 SSMS를 사용하면 원격 컴퓨터에서 어셈블리를 업데이트 할 수 있습니다. 그 동안 SSMS GUI를 통해 어셈블리를 삭제 및 생성하고 모든 종속 기능에 대해 DROP 및 CREATE 작업을 수행합니다.
Zarepheth

나는 그것에 숨을 참지 않을 것입니다. 삭제하고 다시 작성해야하는 한 위에서 설명한 방법 중 하나를 수행 할 수없는 이유는 무엇입니까?
벤 툴

1
"조립품을 추가하고 변경하려면 파일 시스템 참조가 필요합니다." -사실이 아닙니다. 모두 CREATE ASSEMBLYALTER ASSEMBLY어셈블리를 나타내는 BLOB를 취할 것입니다. 2008+에서 생성 된 데이터베이스로 이동하여 프로그래밍 기능-> 어셈블리로 이동하여 Microsoft.SqlServer.Types 어셈블리 생성을 스크립팅하여이를 직접 확인하십시오. 그 거대한 varbinary 는 집합 입니다. 상황에 따라 어셈블리를 로컬 인스턴스에 배포하고 ALTER ASSEMBLY스크립트를 작성 하여 스크립트로 만듭니다.
벤 툴

7

Ben Thul의 답변에 추가하기 위해 SQL Server Management Studio의 GUI를 통해 원격으로 쉽게 수행 할 수 있습니다 .

  1. 데이터베이스의 개체 탐색기-> 프로그래밍 기능에서 어셈블리를 마우스 오른쪽 버튼으로 클릭하고 '새 어셈블리 ...'를 선택하십시오.

  2. 업데이트 된 DLL을 찾습니다.

  3. 동일한 이름의 어셈블리가 이미 존재하므로 실패 할 '확인'을 클릭하는 대신 새 어셈블리 창의 맨 위에있는 '스크립트'를 클릭하십시오.
     
    'CREATE ASSEMBLY'줄과 방금 선택한 DLL 인 거대한 얼룩이 포함 된 SQL 쿼리에 포함됩니다.

  4. 'CREATE'를 'ALTER'로 변경 한 다음 실행하십시오!

스크립트는 또한 실행하기 전에 제거해야하는 'AUTHORIZATION'줄을 만들었습니다. 마일리지가 다를 수 있습니다.

이것이 파일 시스템에 액세스 할 수없는 사람이 서버에 도움이되기를 바랍니다.

Microsoft가 언젠가 SSMS에서이 작업을 일류 작업으로 만들 것이기를 바랍니다.


1

Stackoverflow 에 대한 답변에서 힌트를 찾았습니다 .

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

1
당신은 ALTER ASSEMBLY... ( UPDATEDML에 ALTER있고 DDL에 있습니다.)
miroxlav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.