다음을 통해 공유


CLR 통합 프로그래밍 모델 제한 사항

관리되는 저장 프로시저 또는 기타 관리되는 데이터베이스 개체를 빌드하는 경우 SQL Server에서 수행하는 특정 코드 검사는 데이터베이스에 처음 등록될 때 관리 코드 어셈블리에 대한 검사를 수행하고 문을 사용하여 CREATE ASSEMBLY 런타임에도 수행합니다. 어셈블리에 실제로 런타임에 도달하지 못할 수 있는 코드 경로가 있을 수 있으므로 런타임 시 관리 코드도 확인됩니다. 이렇게 하면 타사 어셈블리를 유연하게 등록할 수 있으므로 클라이언트 환경에서 실행되도록 설계된 '안전하지 않은' 코드가 있지만 호스트된 CLR에서 실행되지 않는 경우 어셈블리가 차단되지 않습니다. 관리 코드가 충족해야 하는 요구 사항은 어셈블리가 가장 엄격한 어셈블리로 SAFEEXTERNAL_ACCESSUNSAFESAFE 등록되었는지, 아니면 가장 엄격한지 여부에 따라 달라집니다.

관리 코드 어셈블리에 대한 제한 사항 외에도 부여된 코드 보안 권한도 있습니다. CLR(공용 언어 런타임)은 관리 코드에 대한 CAS(코드 액세스 보안)라는 보안 모델을 지원합니다. 이 모델에서는 코드의 ID에 따라 어셈블리에 대한 사용 권한이 부여됩니다. SAFE, EXTERNAL_ACCESSUNSAFE 어셈블리에는 CAS 권한이 다릅니다. 자세한 내용은 CLR 통합 코드 액세스 보안을 참조 하세요.

CREATE ASSEMBLY 검사

CREATE ASSEMBLY 문이 실행되면 각 보안 수준에 대해 다음 검사가 수행됩니다. 검사에 실패 CREATE ASSEMBLY 하면 오류 메시지와 함께 실패합니다.

전역(모든 보안 수준)

참조된 모든 어셈블리가 다음 조건을 하나 이상 충족해야 합니다.

  • 어셈블리가 데이터베이스에 이미 등록되어 있습니다.

  • 어셈블리가 지원되는 어셈블리 중 하나입니다. 자세한 내용은 지원되는 .NET Framework 라이브러리를 참조하세요.

  • 위치를> 사용하고<CREATE ASSEMBLY FROM 있으며 참조된 모든 어셈블리와 해당 종속성을 위치에서<> 사용할 수 있습니다.

  • 바이트를> 사용하고<CREATE ASSEMBLY FROM 있으며 모든 참조는 공백으로 구분된 바이트를 통해 지정됩니다.

EXTERNAL_ACCESS

모든 EXTERNAL_ACCESS 어셈블리는 다음 조건을 충족해야 합니다.

  • 정적 필드는 정보를 저장하는 데 사용되지 않습니다. 읽기 전용 정적 필드는 허용됩니다.

  • PEVerify 테스트가 통과됩니다. MSIL 코드 및 관련 메타데이터가 형식 안전 요구 사항을 충족하는지 확인하는 PEVerify 도구(peverify.exe)는 .NET Framework SDK와 함께 제공됩니다.

  • 예를 들어 클래스와의 SynchronizationAttribute 동기화는 사용되지 않습니다.

  • 종료자 메서드는 사용되지 않습니다.

다음과 같은 사용자 지정 특성은 EXTERNAL_ACCESS 어셈블리에서 허용되지 않습니다.

  • System.ContextStaticAttribute

  • System.MTAThreadAttribute

  • System.Runtime.CompilerServices.MethodImplAttribute

  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  • System.Runtime.Remoting.Contexts.ContextAttribute

  • System.Runtime.Remoting.Contexts.SynchronizationAttribute

  • System.Runtime.InteropServices.DllImportAttribute

  • System.Security.Permissions.CodeAccessSecurityAttribute

  • System.Security.SuppressUnmanagedCodeSecurityAttribute

  • System.Security.UnverifiableCodeAttribute

  • System.STAThreadAttribute

  • System.ThreadStaticAttribute

금고

  • 모든 EXTERNAL_ACCESS 어셈블리 조건이 확인됩니다.

런타임 검사

런타임 시 코드 어셈블리에서 다음 조건을 확인합니다. 이러한 조건이 발견되면 관리 코드가 실행될 수 없으며 예외가 throw됩니다.

하지 않은

바이트 배열에서 메서드를 호출 System.Reflection.Assembly.Load() 하여 명시적으로 또는 네임스페이스를 사용하여 Reflection.Emit 암시적으로 어셈블리를 로드하는 것은 허용되지 않습니다.

EXTERNAL_ACCESS

모든 UNSAFE 조건이 확인됩니다.

지원되는 어셈블리 목록에서 다음 HPA(호스트 보호 특성) 값으로 주석이 추가된 모든 형식 및 메서드는 허용되지 않습니다.

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • 동기화

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • 사용자 인터페이스 (UI)

지원되는 어셈블리의 HPA 및 허용되지 않는 형식 및 멤버 목록에 대한 자세한 내용은 호스트 보호 특성 및 CLR 통합 프로그래밍을 참조하세요.

금고

모든 EXTERNAL_ACCESS 조건이 확인됩니다.

또한 참조하십시오

지원되는 .NET Framework 라이브러리
CLR 통합 코드 액세스 보안
호스트 보호 특성 및 CLR 통합 프로그래밍
어셈블리 만들기