2009-08-16 6 views
4

SQL Server에 통합 된 어셈블리를 작성하여 C#으로 작성된 일부 저장 프로 시저를 제공합니다. 어셈블리에는 일부 구성 데이터가 들어있는 읽기 전용 정적 변수가 있습니다. 이 데이터는 어셈블리 프로 시저를 통해 처리되며 어셈블리 프로 시저에서도 제공됩니다. 분명히이 정적 변수에 대한 액세스를 동기화해야합니다. 사용하려고 시도했습니다. 구성 클래스 내에SQL 서버에서 정적 변수에 대한 액세스 동기화 SQLCLR

lock(someGuard) 
{ 
    // ... access static configuration 
} 

을 사용하려고했습니다. 하지만 어셈블리를 완전히 신뢰하여 실행해야한다는 HostProtectionException이 발생합니다. 그렇게 할 수있는 더 좋은 방법이 있습니까?

답변

7

실제로는 문서화되지 않은 해킹이 있습니다. CompilerGenerated 속성을 사용하여 클래스를 장식하십시오. 문서화되지 않은 해결 방법과 마찬가지로, 마일리지는 이후 릴리스와 다를 수 있습니다.

정적은 읽기 전용이면 읽기 전용으로 선언 할 수 있으며 어셈블리는 SAFE 어셈블리에서 허용되는 읽기 전용 정적을 배포합니다. 그리고 진정으로 읽기 전용이며, 자물쇠 가드도 불필요합니다.

읽기 전용으로 표시하고 자물쇠를 제거 할 수 없다면 읽기 전용이 아니므로 모래 영토를 옮길 것임을 의미합니다. SQL 작업자를 차단하고 예기치 않은 결과를 얻을 수 있습니다 (따라서 UNSAFE 요구 사항). CompilerGenerated 트릭은 실제로 lot care와 함께 사용되어야하며, onyl은 완벽하게 의미를 이해해야합니다. lock이 필요하다는 사실은 코드가 SQL 및 통계에 실제로 안전하지 않다는 강력한 표시기입니다.

+0

멋진 팁, Remus! – RBarryYoung

+0

기술적으로 * 문서화 된 것 같습니다. :-) 아마이 사용을 위해 지원되지 않습니다. – RBarryYoung

+0

예, '이 속성을 사용하면 SQL 서버가 컴파일러에서 생성 한 정적 값을 참조 할 수 있습니다.'라고 표시됩니다. AFAIK 이것은이 특성에 대한 유일한 용도입니다. –

2

이 제한 사항을 해결할 수있는 유일한 방법은 어셈블리를 UNSAFE로 배포하는 것입니다. 여러 호출하거나 공유에 걸쳐 개최

SQL 서버에서 관리되는 코드 의 프로그래밍 모델이 요구하는 기능, 절차 및 상태의 사용을 필요로하지 않는 유형 : 아직도, 정적 공유 데이터의 추천 반대 여러 사용자 세션에 걸쳐 의 상태가 유지됩니다. 또한 앞에서 설명한 것처럼 공유 상태가 있으면 응용 프로그램의 확장 성 및 안정성에 영향을주는 치명적인 예외가 발생할 수 있습니다.

이러한 고려 사항을 고려할 때 SQL Server 은 정적 변수 및 정적 데이터 멤버의 사용을 허용하지 않습니다. 안전하고 EXTERNAL 접속 어셈블리를 들어, SQL 서버 어셈블리 작성 시간에 조립 의 메타 데이터를 검사하고 정적 데이터 멤버 변수의 사용을 찾은 경우 이러한 어셈블리 생성 실패.

관련 문제