CLR 통합 프로그래밍 모델 제한 사항
관리되는 저장 프로시저나 다른 관리되는 데이터베이스 개체를 작성하는 경우 SQL Server에서 수행하는 고려할 특정 코드 검사가 있습니다. SQL Server는 데이터베이스에 처음 등록될 때 CREATE ASSEMBLY 문을 사용하여 관리 코드 어셈블리에서 검사를 수행하며 런타임에도 검사를 수행합니다. 실제로 런타임에 접근할 수 없는 코드 경로가 어셈블리에 있을 수 있으므로 관리 코드는 런타임에도 검사됩니다. 따라서 특히 클라이언트 환경에서 실행되는 '안전하지 않은' 코드가 있는 경우 어셈블리가 차단되지 않고 호스팅된 CLR에서 실행되지 않도록 유연성 있게 타사 어셈블리를 등록할 수 있습니다. 관리 코드가 충족해야 하는 요구 사항은 어셈블리가 SAFE, EXTERNAL_ACCESS 또는 UNSAFE로 등록되었는지에 따라 달라지며( SAFE가 가장 엄격함), 아래에 나열되어 있습니다.
관리 코드 어셈블리에 적용되는 제한뿐 아니라 부여되는 코드 보안 권한도 있습니다. CLR(공용 언어 런타임)은 관리 코드에 대해 CAS(코드 액세스 보안)라는 보안 모델을 지원합니다. 이 모델에서는 코드 ID를 기반으로 어셈블리에 사용 권한이 부여됩니다. SAFE, EXTERNAL_ACCESS 및 UNSAFE 어셈블리에는 서로 다른 CAS 권한이 있습니다. 자세한 내용은 CLR 통합 코드 액세스 보안을 참조하십시오.
CREATE ASSEMBLY 검사
CREATE ASSEMBLY 문을 실행하면 각 보안 수준에 대해 다음과 같은 검사가 수행됩니다. 감사가 실패하면 오류 메시지와 함께 CREATE ASSEMBLY가 실패합니다.
전역(모든 보안 수준)
참조된 모든 어셈블리가 다음 조건을 하나 이상 충족해야 합니다.
어셈블리가 데이터베이스에 이미 등록되었습니다.
어셈블리가 지원되는 어셈블리 중 하나입니다. 자세한 내용은 지원되는 .NET Framework 라이브러리를 참조하십시오.
CREATE ASSEMBLY FROM <location>,을 사용하고 있으며 참조된 모든 어셈블리 및 해당 종속성을 <location>에서 사용할 수 있습니다.
CREATE ASSEMBLY FROM <bytes …>,를 사용하고 있으며 모든 참조가 공백으로 구분된 바이트를 통해 지정됩니다.
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
모든 UNSAFE 조건이 검사됩니다.
지원되는 어셈블리 목록에서 다음 HPA(호스트 보호 특성) 값이 주석으로 추가된 유형과 멤버는 모두 허용되지 않습니다.
SelfAffectingProcessMgmt
SelfAffectingThreading
Synchronization
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
HPA 및 지원되는 어셈블리에서 허용되지 않는 유형 및 멤버 목록에 대한 자세한 내용은 호스트 보호 특성 및 CLR 통합 프로그래밍을 참조하십시오.
SAFE
모든 EXTERNAL_ACCESS 조건이 검사됩니다.