다음을 통해 공유


어셈블리 만들기

적용 대상:SQL Server

저장 프로시저나 트리거 같은 관리되는 데이터베이스 개체는 컴파일한 다음 어셈블리라는 단위로 배포합니다. 어셈블리에서 제공하는 기능을 사용하려면 먼저 관리되는 DLL 어셈블리를 SQL Server에 등록해야 합니다. SQL Server 데이터베이스에 어셈블리를 등록하려면 CREATE ASSEMBLY 문을 사용합니다. 이 문서에서는 CREATE ASSEMBLY 문을 사용하여 데이터베이스에 어셈블리를 등록하는 방법과 어셈블리에 대한 보안 설정을 지정하는 방법을 설명합니다.

CREATE ASSEMBLY 문

CREATE ASSEMBLY 문은 데이터베이스에서 어셈블리를 만드는 데 사용됩니다. 예제는 다음과 같습니다.

CREATE ASSEMBLY SQLCLRTest
    FROM 'C:\MyDBApp\SQLCLRTest.dll';

FROM 절은 만들 어셈블리의 경로 이름을 지정합니다. 이 경로는 UNC(유니버설 명명 규칙) 경로 또는 컴퓨터에 로컬인 물리적 파일 경로일 수 있습니다.

SQL Server는 동일한 이름, 문화권 및 공개 키를 사용하여 다른 버전의 어셈블리를 등록하는 것을 허용하지 않습니다.

다른 어셈블리를 참조하는 어셈블리를 만들 수 있습니다. 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 코드 권한은 어셈블리가 확인되지 않거나 Win32 API와 같은 제한된 리소스에 대한 추가 액세스가 필요한 상황에 대한 것입니다.

SQL Server에서 EXTERNAL_ACCESS 또는 UNSAFE 어셈블리를 만들려면 다음 두 조건 중 하나를 충족해야 합니다.

  1. 어셈블리가 강력한 이름으로 서명되거나 인증서로 서명된 Authenticode입니다. 이 강력한 이름(또는 인증서)은 SQL Server 내에서 비대칭 키(또는 인증서)로 만들어지고, EXTERNAL ACCESS ASSEMBLY 권한(외부 액세스 어셈블리의 경우) 또는 UNSAFE ASSEMBLY 권한(안전하지 않은 어셈블리의 경우)이 있는 해당 로그인이 있습니다.

  2. DBO(데이터베이스 소유자)에는 EXTERNAL ACCESS ASSEMBLY(EXTERNAL ACCESS 어셈블리의 경우) 또는 UNSAFE ASSEMBLY(UNSAFE 어셈블리의 경우) 권한이 있으며 데이터베이스에는 TRUSTWORTHY 데이터베이스 속성ON설정됩니다.

이전에 나열된 두 조건도 어셈블리 로드 시 검사됩니다(실행 포함). 어셈블리를 로드하려면 하나 이상의 조건을 충족해야 합니다.

데이터베이스의 TRUSTWORTHY 데이터베이스 속성 서버 프로세스에서 CLR(공용 언어 런타임) 코드를 실행하기 위해서만 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 통합 보안참조하세요.