SQL Server 프로그래밍 및 호스트 보호 특성
업데이트: 2007년 11월
SQL Server 호스트에서 관리 코드를 로드하고 실행하는 기능을 사용하려면 코드 액세스 보안과 호스트 리소스 보호 모두에 대한 요구 사항을 충족해야 합니다. 코드 액세스 보안 요구 사항은 SQL Server 권한 집합인 SAFE, EXTERNAL-ACCESS 또는 UNSAFE 중 하나에 의해 지정됩니다. SAFE 또는 EXTERNAL-ACCESS 권한 집합 내에서 실행되는 코드는 HostProtectionAttribute 특성이 적용된 특정 형식이나 멤버를 사용해서는 안 됩니다. HostProtectionAttribute는 호스트가 허용하지 않는 특정 코드 구문을 형식이나 메서드로 식별한다는 점에서 안정성 보장과 마찬가지로 보안 권한이 아닙니다. HostProtectionAttribute를 사용하면 호스트의 안정성을 보호하도록 돕는 프로그래밍 모델이 적용됩니다.
호스트 보호 특성
호스트 보호 특성은 호스트 프로그래밍 모델에 맞지 않고 다음과 같이 안정성 위협의 증가 수준을 나타내는 형식이나 멤버를 식별합니다.
심각하지 않습니다.
서버에서 관리하는 사용자 코드를 불안정하게 만들 수 있습니다.
서버 프로세스 자체를 불안정하게 만들 수 있습니다.
SQL Server에서는SharedState, Synchronization, MayLeakOnAbort 또는 ExternalProcessMgmt의 HostProtectionResource 값을 지정하는 HostProtectionAttribute가 있는 형식이나 멤버를 사용할 수 없습니다. 이로 인해 상태를 공유할 수 있게 하거나, 동기화를 수행하거나, 종료할 때 리소스 누출을 일으키거나 또는 SQL Server 프로세스의 무결성에 영향을 주는 멤버를 어셈블리가 호출할 수 없습니다.
허용되지 않는 형식 및 멤버
다음 표에서는 SQL Server에서 HostProtectionResource 값이 허용되지 않는 형식과 멤버를 식별합니다.
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 시간에 해당 어셈블리의 메타데이터를 검사하고, 정적 데이터 멤버와 변수가 사용된 경우 어셈블리를 만드는 데 오류가 발생됩니다.