SQL Server에 안정형 어셈블리 사용(C++/CLI)

DLL(동적 연결 라이브러리)로 패키지된 확장 저장 프로시저는 Visual C++로 개발된 함수를 통해 SQL Server 기능을 확장하는 방법을 제공합니다. 확장 저장 프로시저는 DLL 내의 함수로 구현됩니다. 확장 저장 프로시저는 함수 외에도 사용자 정의 형식 및 집계 함수(예: SUM 또는 AVG)를 정의할 수 있습니다.

클라이언트가 확장 저장 프로시저를 실행하면 SQL Server는 확장 저장 프로시저와 연결된 DLL을 검색하고 DLL을 로드합니다. SQL Server는 요청된 확장 저장 프로시저를 호출하고 지정된 보안 컨텍스트에서 실행합니다. 그런 다음 확장 저장 프로시저는 결과 집합을 전달하고 매개 변수를 다시 서버로 반환합니다.

SQL Server는 T-SQL(Transact-SQL)에 대한 확장을 제공하여 SQL Server에 확인 가능한 어셈블리를 설치할 수 있도록 합니다. SQL Server 권한 집합은 다음과 같은 수준의 보안을 사용하여 보안 컨텍스트를 지정합니다.

  • 무제한 모드: 사용자 고유의 위험에서 코드를 실행합니다. 코드는 형식이 안전한 것으로 확인할 필요가 없습니다.

  • 안전 모드: 확인 가능한 typesafe 코드를 실행합니다. /clr:safe를 사용하여 컴파일됩니다.

중요합니다

Visual Studio 2015는 사용되지 않으며 Visual Studio 2017은 확인 가능한 프로젝트의 /clr:pure/clr:safe 생성을 지원하지 않습니다. 확인 가능한 코드가 필요한 경우 코드를 C#으로 변환하는 것이 좋습니다.

확인 가능한 어셈블리를 만들고 SQL Server에 로드하려면 다음과 같이 Transact-SQL 명령 CREATE ASSEMBLY 및 DROP ASSEMBLY를 사용합니다.

CREATE ASSEMBLY <assemblyName> FROM <'Assembly UNC Path'> WITH
  PERMISSION_SET <permissions>
DROP ASSEMBLY <assemblyName>

PERMISSION_SET 명령은 보안 컨텍스트를 지정하고 UNRESTRICTED, SAFE 또는 EXTENDED 값을 가질 수 있습니다.

또한 CREATE FUNCTION 명령을 사용하여 클래스의 메서드 이름에 바인딩할 수 있습니다.

CREATE FUNCTION <FunctionName>(<FunctionParams>)
RETURNS returnType
[EXTERNAL NAME <AssemblyName>:<ClassName>::<StaticMethodName>]

예시

다음 SQL 스크립트(예: "MyScript.sql")는 어셈블리를 SQL Server에 로드하고 클래스의 메서드를 사용할 수 있도록 합니다.

-- Create assembly without external access
drop assembly stockNoEA
go
create assembly stockNoEA
from
'c:\stockNoEA.dll'
with permission_set safe

-- Create function on assembly with no external access
drop function GetQuoteNoEA
go
create function GetQuoteNoEA(@sym nvarchar(10))
returns real
external name stockNoEA:StockQuotes::GetQuote
go

-- To call the function
select dbo.GetQuoteNoEA('MSFT')
go

SQL 스크립트는 SQL Query Analyzer 또는 명령줄에서 sqlcmd.exe 유틸리티를 사용하여 대화형으로 실행할 수 있습니다. 다음 명령줄은 MyServer에 연결하고, 기본 데이터베이스를 사용하며, 신뢰할 수 있는 연결, MyScript.sql 입력 및 출력 MyResult.txt 사용합니다.

sqlcmd -S MyServer -E -i myScript.sql -o myResult.txt

참고 항목

클래스 및 구조체