다음을 통해 공유


어셈블리 디자인

적용 대상: SQL Server

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

  • 어셈블리 패키징
  • 어셈블리 보안 관리
  • 어셈블리에 대한 제한 사항

패키지 어셈블리

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

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

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

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

어셈블리 보안 관리

어셈블리가 관리 코드를 실행할 때 .NET Code Access Security로 보호되는 리소스에 액세스할 수 있는 양을 제어할 수 있습니다. 어셈블리SAFEEXTERNAL_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 ASSEMBLYSQL 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