SQL Server 프로그래밍 및 호스트 보호 특성

SQL Server 호스트에서 관리 코드를 로드하고 실행하는 기능을 사용하려면 코드 액세스 보안과 호스트 리소스 보호 모두에 대한 요구 사항을 충족해야 합니다. 코드 액세스 보안 요구 사항은 SQL Server 권한 집합인 SAFE, EXTERNAL-ACCESS 또는 UNSAFE 중 하나에 의해 지정됩니다. SAFE 또는 EXTERNAL-ACCESS 권한 집합 내에서 실행되는 코드는 HostProtectionAttribute 특성이 적용된 특정 형식이나 멤버를 사용해서는 안 됩니다. HostProtectionAttribute는 호스트가 허용하지 않는 특정 코드 구문을 형식이나 메서드로 식별한다는 점에서 안정성 보장과 마찬가지로 보안 권한이 아닙니다. HostProtectionAttribute를 사용하면 호스트의 안정성을 보호하도록 돕는 프로그래밍 모델이 적용됩니다.

호스트 보호 특성

호스트 보호 특성은 호스트 프로그래밍 모델에 맞지 않고 다음과 같이 안정성 위협의 증가 수준을 나타내는 형식이나 멤버를 식별합니다.

  • 심각하지 않습니다.

  • 서버에서 관리하는 사용자 코드를 불안정하게 만들 수 있습니다.

  • 서버 프로세스 자체를 불안정하게 만들 수 있습니다.

SQL Server에서는SharedState, Synchronization, MayLeakOnAbort 또는 ExternalProcessMgmtHostProtectionResource 값을 지정하는 HostProtectionAttribute가 있는 형식이나 멤버를 사용할 수 없습니다. 이로 인해 상태를 공유할 수 있게 하거나, 동기화를 수행하거나, 종료할 때 리소스 누출을 일으키거나 또는 SQL Server 프로세스의 무결성에 영향을 주는 멤버를 어셈블리가 호출할 수 없습니다.

허용되지 않는 형식 및 멤버

다음 표에서는 SQL Server에서 HostProtectionResource 값이 허용되지 않는 형식과 멤버를 식별합니다.

Namespace

형식 또는 멤버

Microsoft.Win32

PowerModeChangedEventArgs 클래스

PowerModeChangedEventHandler 대리자

SessionEndedEventArgs 클래스

SessionEndedEventHandler 대리자

SessionEndingEventArgs 클래스

SessionEndingEventHandler 대리자

SessionSwitchEventArgs 클래스

SessionSwitchEventHandler 대리자

SystemEvents 클래스

TimerElapsedEventArgs 클래스

TimerElapsedEventHandler 대리자

UserPreferenceChangedEventArgs 클래스

UserPreferenceChangingEventArgs 클래스

System.Collections

ArrayList.Synchronized 메서드

Hashtable.Synchronized 메서드

Queue.Synchronized 메서드

SortedList.Synchronized 메서드

Stack.Synchronized 메서드

System.ComponentModel

AddingNewEventArgs 클래스

AddingNewEventHandler 대리자

ArrayConverter 클래스

AsyncCompletedEventArgs 클래스

AsyncCompletedEventHandler 대리자

AsyncOperation 클래스

AsyncOperationManager 클래스

AttributeCollection 클래스

BackgroundWorker 클래스

BaseNumberConverter 클래스

BindingList<T> 클래스

BooleanConverter 클래스

ByteConverter 클래스

CancelEventArgs 클래스

CancelEventHandler 대리자

CharConverter 클래스

CollectionChangeEventArgs 클래스

CollectionChangeEventHandler 대리자

CollectionConverter 클래스

ComponentCollection 클래스

ComponentConverter 클래스

ComponentEditor 클래스

ComponentResourceManager 클래스

Container 클래스

ContainerFilterService 클래스

CultureInfoConverter 클래스

CustomTypeDescriptor 클래스

DateTimeConverter 클래스

DecimalConverter 클래스

ActiveDesignerEventArgs 클래스

ActiveDesignerEventHandler 대리자

CheckoutException 클래스

CommandID 클래스

ComponentChangedEventArgs 클래스

ComponentChangedEventHandler 대리자

ComponentChangingEventArgs 클래스

ComponentChangingEventHandler 대리자

ComponentEventArgs 클래스

ComponentEventHandler 대리자

ComponentRenameEventArgs 클래스

ComponentRenameEventHandler 대리자

DesignerCollection 클래스

DesignerEventArgs 클래스

DesignerEventHandler 대리자

DesignerOptionService 클래스

DesignerTransaction 클래스

DesignerTransactionCloseEventArgs 클래스

DesignerTransactionCloseEventHandler 대리자

DesignerVerb 클래스

DesignerVerbCollection 클래스

DesigntimeLicenseContext 클래스

DesigntimeLicenseContextSerializer 클래스

MenuCommand 클래스

ComponentSerializationService 클래스

ContextStack 클래스

DesignerLoader 클래스

InstanceDescriptor 클래스

MemberRelationshipService 클래스

ResolveNameEventArgs 클래스

ResolveNameEventHandler 대리자

SerializationStore 클래스

ServiceContainer 클래스

ServiceCreatorCallback 대리자

StandardCommands 클래스

StandardToolWindows 클래스

DoubleConverter 클래스

DoWorkEventArgs 클래스

DoWorkEventHandler 대리자

EnumConverter 클래스

EventDescriptor 클래스

EventDescriptorCollection 클래스

EventHandlerList 클래스

ExpandableObjectConverter 클래스

HandledEventArgs 클래스

HandledEventHandler 대리자

InstanceCreationEditor 클래스

Int16Converter 클래스

Int32Converter 클래스

Int64Converter 클래스

InvalidAsynchronousStateException 클래스

InvalidEnumArgumentException 클래스

BeginInvoke 메서드

License 클래스

LicenseContext 클래스

LicenseException 클래스

LicenseManager 클래스

LicenseProvider 클래스

LicFileLicenseProvider 클래스

ListChangedEventArgs 클래스

ListChangedEventHandler 대리자

ListSortDescription 클래스

ListSortDescriptionCollection 클래스

MaskedTextProvider 클래스

MemberDescriptor 클래스

MultilineStringConverter 클래스

NestedContainer 클래스

NullableConverter 클래스

ProgressChangedEventArgs 클래스

ProgressChangedEventHandler 대리자

PropertyChangedEventArgs 클래스

PropertyChangedEventHandler 대리자

PropertyDescriptor 클래스

PropertyDescriptorCollection 클래스

ReferenceConverter 클래스

RefreshEventArgs 클래스

RefreshEventHandler 대리자

RunWorkerCompletedEventArgs 클래스

RunWorkerCompletedEventHandler 대리자

SByteConverter 클래스

SingleConverter 클래스

StringConverter 클래스

SyntaxCheck 클래스

TimeSpanConverter 클래스

TypeConverter 클래스

TypeDescriptionProvider 클래스

TypeDescriptor 클래스

TypeListConverter 클래스

UInt16Converter 클래스

UInt32Converter 클래스

UInt64Converter 클래스

WarningException 클래스

Win32Exception 클래스

System.Diagnostics

Debug.Listeners 속성

Trace.Listeners 속성

EventLog.SynchronizingObject 속성

ConsoleTraceListener 클래스

DefaultTraceListener 클래스

DelimitedListTraceListener 클래스

EventLogTraceListener 클래스

PerformanceCounter 클래스

PerformanceCounterCategory 클래스

Process 클래스

ProcessStartInfo 클래스

TextWriterTraceListener 클래스

TraceListener 클래스

XmlWriterTraceListener 클래스

TraceSource.Listeners 속성

System.IO

Stream.Synchronized 메서드

TextReader.Synchronized 메서드

TextWriter.Synchronized 메서드

System.Reflection.Emit

ConstructorBuilder 클래스

EventBuilder 클래스

FieldBuilder 클래스

MethodBuilder 클래스

CustomAttributeBuilder 클래스

MethodRental 클래스

ModuleBuilder 클래스

PropertyBuilder 클래스

TypeBuilder 클래스

UnmanagedMarshal 클래스

System.Text

Group.Synchronized 메서드

Match.Synchronized 메서드

System.Threading

AutoResetEvent 클래스

EventWaitHandle 클래스

ManualResetEvent 클래스

Monitor 클래스

Mutex 클래스

ReaderWriterLock 클래스

Semaphore 클래스

Thread.AllocateNamedDataSlot 메서드

Thread.BeginCriticalRegion 메서드

Thread.EndCriticalRegion 메서드

Thread.FreeNamedDataSlot 메서드

Thread.GetData 메서드

Thread.Join 메서드

Thread.SetApartmentState 메서드

Thread.SetData 메서드

Thread.SpinWait 메서드

Thread.Start 메서드

Thread.TrySetApartmentState 메서드

ThreadPool 클래스

Timer 클래스

System.Timers

Timer 클래스

System.Web.Configuration

MachineKeyValidationConverter 클래스

System.Windows.Forms

AutoCompleteStringCollection.SyncRoot 속성

SQL Server 권한 집합

SQL Server에서는 사용자가 데이터베이스에 배포되는 코드의 안정성 요구 사항을 지정할 수 있습니다. 어셈블리가 데이터베이스에 업로드될 때 어셈블리 작성자는 해당 어셈블리에 대해 SAFE, EXTERNAL-ACCESS 또는 UNSAFE의 세 가지 권한 집합 중 하나를 지정할 수 있습니다.

권한 집합

SAFE

EXTERNAL-ACCESS

UNSAFE

코드 액세스 보안

실행 전용

실행 + 외부 리소스에 대한 액세스

무제한

프로그래밍 모델 제한

제한 없음

검증 가능성 요구 사항

아니요

네이티브 코드를 호출하는 기능

아니요

아니요

SAFE는 가장 신뢰할 수 있고 안전한 모드로, 허용되는 프로그래밍 모델에 대한 제한 사항이 있습니다. SAFE 코드에는 높은 안정성 및 보안 기능이 있습니다. SAFE 어셈블리는 실행하고, 계산을 수행하고, 로컬 데이터베이스에 액세스할 수 있는 권한이 부여됩니다. SAFE 어셈블리는 확인할 수 있는 형식이 안전한 어셈블리여야 하며 비관리 코드를 호출할 수 없습니다.

EXTERNAL-ACCESS는 중급 보안 옵션을 제공하며 코드가 데이터베이스 외부의 리소스에 액세스하도록 허용하지만 여전히 SAFE 수준의 안정성과 보안을 갖습니다.

UNSAFE는 데이터베이스 관리자만 만들 수 있는 신뢰 수준이 높은 코드용입니다. 이 신뢰되는 코드는 코드 액세스 제한이 없으며 비관리(네이티브) 코드를 호출할 수 있습니다.

SQL Server는 호스트 수준의 코드 액세스 보안 정책 계층을 사용하여 SQL Server 카탈로그에 저장되어 있는 권한 집합에 기초하여 세 가지 권한 집합 중 하나를 부여하는 호스트 정책을 설정합니다. 데이터베이스 내부에서 실행되는 관리 코드에는 항상 이러한 코드 액세스 권한 집합 중 하나가 부여됩니다.

프로그래밍 모델 제한

SQL Server의 관리 코드에 대한 프로그래밍 모델에는 여러 호출에 걸쳐 유지되는 상태의 사용 또는 여러 사용자 세션에 걸친 상태의 공유를 필요로 하지 않는 함수, 프로시저 및 형식이 필요합니다. 또한 앞부분에서 설명한 것과 같이 공유된 상태가 있는 경우 해당 응용 프로그램의 확장성과 안정성에 영향을 주는 중대한 예외가 발생될 수 있습니다.

이러한 점을 고려하여 SQL Server에서는 정적 변수의 사용과 정적 데이터 멤버를 허용하지 않습니다. SAFE 및 EXTERNAL-ACCESS 어셈블리의 경우 SQL Server에서 CREATE ASSEMBLY 시간에 해당 어셈블리의 메타데이터를 검사하고, 정적 데이터 멤버와 변수가 사용된 경우 어셈블리를 만드는 데 오류가 발생됩니다.

참고 항목

참조

HostProtectionAttribute

HostProtectionResource