다음을 통해 공유


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

적용 대상: SQL Server Azure SQL Managed Instance

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

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

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

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

CREATE ASSEMBLY 검사

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 조건이 확인됩니다.