SQL Server를 다시 시작하는 것 외에 SQLCLR AppDomain을 강제로 다시 설정하는 방법이 있습니까?


11

SQLCLR에서 사용되는 AppDomain을 강제로 재설정하고 싶습니다. SQL Server 인스턴스를 다시 시작하는 것 외에 어떻게해야합니까?


답변 업데이트에 대한 알림을 받았는지 확실하지 않지만 더 쉬운 방법으로 답변을 업데이트했습니다. :)
Solomon Rutzky

답변:


6

나는 이것이 약간 잔인하다는 것을 알고 있지만 CLR을 비활성화하고 다시 활성화하는 것은 어떻습니까?

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
이 방법에 대한 한 가지 중요한 세부 사항은 STANDBY (읽기 전용) 데이터베이스에 대해 실행될 때 작동한다는 것입니다. 내가 시도한 다른 모든 방법은 그렇지 않습니다. CLR 어셈블리에 대한 업데이트가 STANDBY 카탈로그로의 로그 전달을 통해 정상적으로 전파되었으므로 AppDomain이 다시로드되지 않았기 때문에이 기능이 필요했습니다.
Granger

@Granger는 매우 흥미롭고 알고 있습니다 :). 그러나 SQL Server의 버그를 고려할 것입니다. 당신은 연결 사이트를 통해이를보고 할 수 있습니다 : connect.microsoft.com/SQLServer/Feedback
솔로몬 Rutzky에게

1
@ srutzky-제안 주셔서 감사합니다; 나는 그들이 "수정하지 않음"으로 보고서를 닫을 것으로 예상합니다. 이 설정은 카탈로그별로가 아니라 서버 전체에 적용됩니다 ( '중첩 트리거', '파일 스트림 액세스 수준'등). 그것은 내가 열려고했던 벌레의 가능성입니다.
Granger

@Granger (및 Max) : 버그라고 생각한 것에 대해 명확하지 않았습니다. 언로드를 유발하는 "CLR Enabled"설정을 재설정하는 것이 버그라고 말하지 않았습니다. ALTER ASSEMBLY앱 도메인을 다시로드하지 않거나 최소한 언로드하지 않은 로그 전달을 통해 전파 된 것이 버그 라고 말하고 있었습니다. 어느 쪽이든, 나는 여기에 내 대답에 더 쉬운 방법을 찾았습니다. 이 새로운 방법을 테스트 할 수 있다면 설명 된 로그 전달 시나리오에서 작동하는지 궁금합니다.
Solomon Rutzky

8

다른 모든 어셈블리에 영향을 미치지 않는보다 우아한 솔루션이 있습니다. 앱 도메인에서 어셈블리 중 하나의 PERMISSION_SET을 변경하면됩니다 (앱 도메인은 사용자 당).

ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that 
                                                      this assembly is not current at}

PERMISSION_SET을 원래 상태로 다시 설정해야합니다. 또한 PERMISSION_SET을 변경하여 언로드하기 전에 어셈블리의 메소드에 액세스해야합니다. 현재 활성화 된 앱 도메인에로드되지 않은 어셈블리를 변경해도 다른 어셈블리와 함께 앱 도메인에는 영향을 미치지 않습니다 (앱 도메인은 DB 별, 사용자 별, 어셈블리 별이 아님).


업데이트
위에서 설명한 방법은 하나의 App Domain 만 언로드하는 가장 세분화 된 방법입니다. 그러나 어셈블리를 다른 두 레벨 중 하나로 설정할 수 있어야합니다. 표시된 것으로 표시된 어셈블리의 SAFE경우

  • 데이터베이스가로 설정되어 TRUSTWORTHY ON있거나
  • 어셈블리와 동일한 서명을 기반으로하는 비대칭 키를 기반으로하는 어셈블리에 서명되고 로그인이 존재하며 EXTERNAL ACCESS ASSEMBLY또는 UNSAFE ASSEMBLY권한 이 부여 된 경우

이 경우 TRUSTWORTHY설정 ON을 변경 한 다음 즉시 다시 되돌릴 수 OFF있으며 해당 데이터베이스에서 모든 앱 도메인 이 언로드 됩니다.

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

어쨌든 데이터베이스에 하나의 App Domain 만있는 경우 (그리고 이것이 95 % 이상인 것으로 생각되는 경우) 여기에 설명 된 두 가지 방법 모두 동일한 효과를 나타냅니다. 그리고이 상황에서는 ALTER DATABASE특정 객체 이름을 지정할 필요가없고 원본 PERMISSION_SET이 무엇인지 알 필요가 없기 때문에이 방법이 더 단순 해 보입니다 .

또한 단일 App Domain 만 ALTER DATABASE있는 경우 데이터베이스가 이미 설정되어 TRUSTWORTHY ON있거나 적절한 권한으로 키베이스 로그인을 설정 한 경우에도 방법이 더 간단 합니다. 당신이 키 기반 로그인을 사용하는 경우에 당신은 설정할 수 있습니다 TRUSTWORTHYON다음 OFF다시 위에서 언급했다. 그러나 이미로 TRUSTWORTHY설정 한 경우에는 ON반대로 설정 OFF한 다음 즉시 다시 설정하십시오 ON.

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

1
업데이트 된 접근 방식 STANDBY (READ_ONLY) 데이터베이스 카탈로그에서 작동합니다. Sql Server에서는 "TRUSTWORTHY"설정을 변경 한 다음 이전 설정으로 복원 할 수있었습니다. 의 결과를 확인하여 변경 사항이 실제로 도메인을 언로드했는지 확인했습니다 SELECT * FROM sys.dm_clr_appdomains;. 단.
Granger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.