다음을 통해 공유


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

적용 대상:SQL ServerAzure SQL Managed Instance

관리되는 저장 프로시저 또는 기타 관리되는 데이터베이스 개체를 빌드할 때 SQL Server는 고려해야 하는 특정 코드 검사 수행합니다. 이러한 검사 데이터베이스에 처음 등록될 때, 문을 사용하고 CREATE ASSEMBLY 런타임에 관리 코드 어셈블리에서 수행됩니다. 어셈블리에 실제로 런타임에 도달하지 못할 수 있는 코드 경로가 있을 수 있으므로 관리 코드도 런타임 시 검사.

이러한 코드 검사 특히 타사 어셈블리를 등록할 수 있는 유연성을 제공하므로 클라이언트 환경에서 실행되도록 설계된 안전하지 않은 코드가 있지만 호스트된 CLR(공용 언어 런타임)에서 실행되지 않는 경우 어셈블리가 차단되지 않습니다. 관리 코드가 충족해야 하는 요구 사항은 어셈블리가 로 등록SAFEEXTERNAL_ACCESSUNSAFE되었는지 여부에 따라 달라집니다. SAFE 는 가장 엄격한 보안 수준입니다.

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

게시자 정책이 설정된 CREATE ASSEMBLY 경우 실패합니다.

CREATE ASSEMBLY 검사s

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

전역(모든 보안 수준)

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

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

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

  • 사용 CREATE ASSEMBLY FROM <location>중이며 참조된 모든 어셈블리와 해당 종속성은 .에서 <location>사용할 수 있습니다.

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

EXTERNAL_ACCESS

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

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

  • PEVerify 테스트가 통과됩니다. CIL(공용 중간 언어) 코드 및 관련 메타데이터가 형식 안전 요구 사항을 충족하는지 검사 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

SAFE

  • 모든 EXTERNAL_ACCESS 어셈블리 조건이 검사.

런타임 검사

런타임 시 코드 어셈블리는 다음 조건에 대해 검사. 이러한 조건이 발견되면 관리 코드가 실행될 수 없으며 예외가 throw됩니다.

UNSAFE

바이트 배열에서 메서드를 명시적으로 호출 System.Reflection.Assembly.Load() 하거나 네임스페이스를 암시적으로 사용하여 Reflection.Emit 어셈블리를 로드할 수 없습니다.

EXTERNAL_ACCESS

모든 UNSAFE 조건이 검사.

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

  • SelfAffectingProcessMgmt
  • SelfAffectingThreading
  • Synchronization
  • SharedState
  • ExternalProcessMgmt
  • ExternalThreading
  • SecurityInfrastructure
  • MayLeakOnAbort
  • UI

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

SAFE

모든 EXTERNAL_ACCESS 조건이 검사.