어셈블리 만들기
적용 대상: SQL Server
저장 프로시저나 트리거 같은 관리되는 데이터베이스 개체는 컴파일한 다음 어셈블리라는 단위로 배포합니다. 어셈블리에서 제공하는 기능을 사용하려면 먼저 관리되는 DLL 어셈블리를 Microsoft SQL Server에 등록해야 합니다. SQL Server 데이터베이스에 어셈블리를 등록하려면 CREATE ASSEMBLY 문을 사용합니다. 이 항목에서는 CREATE ASSEMBLY 문을 사용하여 데이터베이스에 어셈블리를 등록하는 방법과 어셈블리에 대한 보안 설정을 지정하는 방법에 대해 설명합니다.
CREATE ASSEMBLY 문
CREATE ASSEMBLY 문은 데이터베이스에 어셈블리를 만드는 데 사용합니다. 예를 들어 다음과 같습니다.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
FROM 절은 만들려는 어셈블리의 경로 이름을 지정합니다. 이 경로는 UNC(유니버설 명명 규칙) 경로 또는 컴퓨터에 로컬인 물리적 파일 경로일 수 있습니다.
SQL Server에서는 이름, culture 및 공개 키가 동일한 서로 다른 버전의 어셈블리를 등록할 수 없습니다.
다른 어셈블리를 참조하는 어셈블리를 만들 수 있습니다. SQL Server에서 어셈블리를 만들 때 참조된 어셈블리가 데이터베이스에 아직 만들어지지 않은 경우 SQL Server는 루트 수준 어셈블리에서 참조하는 어셈블리도 만듭니다.
데이터베이스 사용자 또는 사용자 역할에는 데이터베이스에서 어셈블리를 만들고 소유할 수 있는 권한이 부여됩니다. 어셈블리를 만들려면 데이터베이스 사용자 또는 역할에 CREATE ASSEMBLY 권한이 있어야 합니다.
어셈블리는 다음과 같은 경우에만 다른 어셈블리를 참조하는 데 성공할 수 있습니다.
호출되거나 참조되는 어셈블리는 동일한 사용자 또는 역할이 소유합니다.
호출되거나 참조되는 어셈블리가 동일한 데이터베이스에 만들어졌습니다.
어셈블리를 만들 때 보안 지정
SQL Server 데이터베이스에 어셈블리를 만들 때 코드를 실행할 수 있는 세 가지 보안 수준 중 하나인 SAFE, EXTERNAL_ACCESS 또는 UNSAFE를 지정할 수 있습니다. CREATE ASSEMBLY 문이 실행되면 코드 어셈블리에서 특정 검사가 수행되므로 어셈블리가 서버에 등록되지 않을 수 있습니다.
SAFE 는 기본 사용 권한 집합이며 대부분의 시나리오에서 작동합니다. 지정된 보안 수준을 지정하려면 다음과 같이 CREATE ASSEMBLY 문의 구문을 수정합니다.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE;
위의 세 번째 코드 줄을 생략하여 SAFE 권한 집합을 사용하여 어셈블리를 만들 수도 있습니다.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
어셈블리의 코드를 SAFE 권한 집합으로 실행할 경우 코드는 in-process 관리 공급자를 통해 서버 내에서 계산 및 데이터 액세스만 수행할 수 있습니다.
EXTERNAL_ACCESS 및 UNSAFE 어셈블리 만들기
EXTERNAL_ACCESS 코드가 파일, 네트워크, 레지스트리 및 환경 변수와 같은 서버 외부의 리소스에 액세스해야 하는 시나리오를 다룹니다. 서버가 외부 리소스에 액세스할 때마다 관리 코드를 호출하는 사용자의 보안 컨텍스트를 가장합니다.
UNSAFE 코드 권한은 어셈블리가 확인되지 않거나 Microsoft Win32 API와 같은 제한된 리소스에 대한 추가 액세스가 필요한 상황에 대한 것입니다.
SQL Server에서 EXTERNAL_ACCESS 또는 UNSAFE 어셈블리를 만들려면 다음 두 조건 중 하나를 충족해야 합니다.
어셈블리가 강력한 이름으로 서명되거나 인증서로 서명된 Authenticode입니다. 이 강력한 이름(또는 인증서)은 SQL Server 내에서 비대칭 키(또는 인증서)로 만들어지고 EXTERNAL ACCESS ASSEMBLY 권한(외부 액세스 어셈블리의 경우) 또는 UNSAFE ASSEMBLY 권한(안전하지 않은 어셈블리의 경우)이 있는 해당 로그인이 있습니다.
DBO(데이터베이스 소유자)에게 EXTERNAL ACCESS ASSEMBLY ( EXTERNAL ACCESS 어셈블리의 경우) 또는 UNSAFE ASSEMBLY ( UNSAFE 어셈블리의 경우) 권한이 있고 데이터베이스의 TRUSTWORTHY Database Property 이 ON으로 설정되어 있습니다.
위에 나열된 두 가지 조건은 어셈블리가 실행될 때는 물론 로드될 때에도 검사되며 어셈블리를 로드하려면 하나 이상의 조건을 충족해야 합니다.
서버 프로세스에서 CLR(공용 언어 런타임) 코드를 실행하기 위해서만 데이터베이스의 TRUSTWORTHY 데이터베이스 속성을 ON으로 설정하지 않는 것이 좋습니다. 이 경우 대신 master 데이터베이스의 어셈블리 파일에서 비대칭 키를 만드는 것이 좋습니다. 그런 다음 이 비대칭 키에 매핑된 로그인을 만들고 로그인에 EXTERNAL ACCESS ASSEMBLY 또는 UNSAFE ASSEMBLY 권한을 부여해야 합니다.
다음 Transact-SQL 문은 비대칭 키를 만들고, 이 키에 로그인을 매핑한 다음, 로그인에 EXTERNAL_ACCESS 권한을 부여하는 데 필요한 단계를 수행합니다. CREATE ASSEMBLY 문을 실행하기 전에 다음 Transact-SQL 문을 실행해야 합니다.
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
GO
참고 항목
비대칭 키와 연결할 새 로그인을 만들어야 합니다. 이 로그인은 사용 권한을 부여하기 위해서만 사용됩니다. 사용자에 연결하거나 애플리케이션 내에서 사용할 필요는 없습니다.
EXTERNAL ACCESS 어셈블리를 만들려면 작성자에 EXTERNAL ACCESS 권한이 있어야 합니다. 어셈블리를 만들 때 지정됩니다.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
다음 Transact-SQL 문은 비대칭 키를 만들고, 이 키에 로그인을 매핑한 다음, 로그인에 UNSAFE 권한을 부여하는 데 필요한 단계를 수행합니다. CREATE ASSEMBLY 문을 실행하기 전에 다음 Transact-SQL 문을 실행해야 합니다.
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;
GO
어셈블리가 UNSAFE 권한으로 로드되도록 지정하려면 어셈블리를 서버에 로드할 때 UNSAFE 권한 집합을 지정 합니다.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
각 설정에 대한 사용 권한에 대한 자세한 내용은 CLR Integration Security를 참조하세요.
참고 항목
CLR 통합 어셈블리 관리
어셈블리 변경
어셈블리 삭제
CLR 통합 코드 액세스 보안
TRUSTWORTHY 데이터베이스 속성