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

적용 대상: SQL Server Azure SQL Managed Instance

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

관리 코드 어셈블리에 적용되는 제한뿐 아니라 부여되는 코드 보안 권한도 있습니다. CLR(공용 언어 런타임)은 관리 코드에 대해 CAS(코드 액세스 보안)라는 보안 모델을 지원합니다. 이 모델에서는 코드 ID를 기반으로 어셈블리에 사용 권한이 부여됩니다. SAFE, EXTERNAL_ACCESSUNSAFE 어셈블리에는 다른 CAS 권한이 있습니다. 자세한 내용은 CLR 통합 코드 액세스 보안을 참조하세요.

CREATE ASSEMBLY 검사

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

전역(모든 보안 수준)

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

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

  • 어셈블리가 지원되는 어셈블리 중 하나입니다. 자세한 내용은 Supported .NET Framework Libraries을 참조하세요.

  • 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

SAFE

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

런타임 검사

런타임에 코드 어셈블리에서 다음 조건이 검사됩니다. 이러한 조건 중 하나가 발견되면 관리 코드를 실행할 수 없으며 예외가 throw됩니다.

UNSAFE

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

EXTERNAL_ACCESS

모든 안전하지 않은 조건이 확인됩니다.

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

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • 동기화

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

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

SAFE

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

참고 항목

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