다음을 통해 공유


어셈블리 - 디자인

적용 대상: SQL Server

이 항목에서는 어셈블리를 디자인할 때 고려해야 할 다음과 같은 요인에 대해 설명합니다.

  • 어셈블리 패키징

  • 어셈블리 보안 관리

  • 어셈블리에 대한 제한 사항

어셈블리 패키징

어셈블리에는 둘 이상의 SQL Server 루틴 또는 해당 클래스 및 메서드의 형식에 대한 기능이 포함될 수 있습니다. 대부분의 경우, 특히 이러한 루틴이 메서드가 서로 호출하는 클래스를 공유하는 경우 같은 어셈블리 내에서 관련 함수를 수행하는 루틴의 기능을 패키지하는 것이 좋습니다. 예를 들어 CLR(공용 언어 런타임) 트리거 및 CLR 저장 프로시저에 대한 데이터 항목 관리 작업을 수행하는 클래스는 동일한 어셈블리에 패키지될 수 있습니다. 이러한 클래스에 대한 메서드는 덜 관련된 작업의 메서드보다 서로 호출할 가능성이 더 높기 때문입니다.

코드를 어셈블리로 패키징하는 경우 다음을 고려해야 합니다.

  • CLR 사용자 정의 함수에 의존하는 CLR 사용자 정의 유형 및 인덱스는 영구 데이터가 어셈블리에 의존하는 데이터베이스에 포함되도록 만들 수 있습니다. 데이터베이스의 어셈블리에 따라 달라지는 지속형 데이터가 있는 경우 어셈블리의 코드를 수정하는 것이 더 복잡한 경우가 많습니다. 따라서 일반적으로 지속형 데이터 종속성이 의존하는 코드(예: 사용자 정의 형식 및 사용자 정의 함수를 사용하는 인덱스)를 이러한 지속형 데이터 종속성이 없는 코드와 분리하는 것이 좋습니다. 자세한 내용은 어셈블리ALTER ASSEMBLY 구현(Transact-SQL)을 참조하세요.

  • 관리 코드 조각에 더 높은 권한이 필요한 경우 해당 코드를 더 높은 권한이 필요하지 않은 코드와 별도의 어셈블리로 분리하는 것이 좋습니다.

어셈블리 보안 관리

어셈블리가 관리 코드를 실행할 때 .NET Code Access Security로 보호되는 리소스에 액세스할 수 있는 양을 제어할 수 있습니다. 이렇게 하려면 어셈블리를 만들거나 수정할 때 SAFE, EXTERNAL_ACCESS 또는 UNSAFE의 세 가지 권한 집합 중 하나를 지정합니다.

SAFE

SAFE는 기본 권한 집합이며 가장 제한적입니다. SAFE 권한이 있는 어셈블리에서 실행하는 코드는 파일, 네트워크, 환경 변수 또는 레지스트리와 같은 외부 시스템 리소스에 액세스할 수 없습니다. SAFE 코드는 로컬 SQL Server 데이터베이스의 데이터에 액세스하거나 로컬 데이터베이스 외부의 리소스에 액세스하지 않는 계산 및 비즈니스 논리를 수행할 수 있습니다.

대부분의 어셈블리는 SQL Server 외부의 리소스에 액세스할 필요 없이 계산 및 데이터 관리 작업을 수행합니다. 따라서 어셈블리 권한 집합으로 SAFE를 사용하는 것이 좋습니다.

EXTERNAL_ACCESS

EXTERNAL_ACCESS 어셈블리는 파일, 네트워크, 웹 서비스, 환경 변수 및 레지스트리와 같은 특정 외부 시스템 리소스에 액세스할 수 있습니다. EXTERNAL ACCESS 권한이 있는 SQL Server 로그인만 EXTERNAL_ACCESS 어셈블리를 만들 수 있습니다.

SAFE 및 EXTERNAL_ACCESS 어셈블리는 형식이 안전한 코드만 포함할 수 있습니다. 즉, 이러한 어셈블리는 형식 정의에 유효한 잘 정의된 진입점을 통해서만 클래스에 액세스할 수 있습니다. 따라서 이러한 유형은 코드에서 소유하지 않은 메모리 버퍼에 임의로 액세스할 수 없습니다. 또한 SQL Server 프로세스의 견고성에 부정적인 영향을 줄 수 있는 작업을 수행할 수 없습니다.

UNSAFE

UNSAFE는 어셈블리가 SQL Server 내부 및 외부에서 리소스에 무제한으로 액세스할 수 있도록 합니다. UNSAFE 어셈블리 내에서 실행되는 코드는 관리되지 않는 코드를 호출할 수 있습니다.

또한 UNSAFE를 지정하면 어셈블리의 코드가 CLR 검증 도구에서 형식이 안전하지 않은 것으로 간주되는 작업을 수행할 수 있습니다. 이러한 작업은 SQL Server 프로세스 공간의 메모리 버퍼에 제어되지 않는 방식으로 액세스할 수 있습니다. UNSAFE 어셈블리는 SQL Server 또는 공용 언어 런타임 중 하나의 보안 시스템을 손상시킬 수도 있습니다. UNSAFE 권한은 숙련된 개발자 또는 관리자가 가장 신뢰할 수 있는 어셈블리에만 부여해야 합니다. sysadmin 고정 서버 역할의 멤버만 UNSAFE 어셈블리를 만들 수 있습니다.

어셈블리에 대한 제한

SQL Server는 신뢰할 수 있고 확장 가능한 방식으로 실행할 수 있도록 어셈블리의 관리 코드에 특정 제한을 적용합니다. 즉, 서버의 견고성을 손상시킬 수 있는 특정 작업은 SAFE 및 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.STAThreadAttribute  
System.ThreadStaticAttribute  

또한 SAFE 및 EXTERNAL_ACCESS 어셈블리는 다음 사용자 지정 특성으로 주석을 추가할 수 없습니다.

System.Security.SuppressUnmanagedCodeSecurityAttribute  
System.Security.UnverifiableCodeAttribute  

허용되지 않는 .NET Framework API

허용되지 않는 HostProtectionAttributes 중 하나로 주석이 추가된 Microsoft .NET Framework API는 SAFE 및 EXTERNAL_ACCESS 어셈블리에서 호출할 수 없습니다.

eSelfAffectingProcessMgmt  
eSelfAffectingThreading  
eSynchronization  
eSharedState   
eExternalProcessMgmt  
eExternalThreading  
eSecurityInfrastructure  
eMayLeakOnAbort  
eUI  

지원되는 .NET Framework 어셈블리

사용자 지정 어셈블리에서 참조하는 모든 어셈블리는 CREATE ASSEMBLY를 사용하여 SQL Server에 로드해야 합니다. 다음 .NET Framework 어셈블리는 이미 SQL Server에 로드되어 있으므로 CREATE ASSEMBLY를 사용하지 않고도 사용자 지정 어셈블리에서 참조할 수 있습니다.

CustomMarshalers.dll  
Microsoft.VisualBasic.dll  
Microsoft.VisualC.dll  
mscorlib.dll  
System.dll  
System.Configuration.dll  
System.Core.dll  
System.Data.dll  
System.Data.OracleClient.dll  
System.Data.SqlXml.dll  
System.Deployment.dll  
System.Security.dll  
System.Transactions.dll  
System.Web.Services.dll  
system.Xml.dll  
System.Xml.Linq.dll  

참고 항목

어셈블리(데이터베이스 엔진)
CLR 통합 보안