CLR 데이터베이스 개체를 디버그하는 방법

적용 대상:SQL Server

SQL Server는 데이터베이스에서 Transact-SQL 및 CLR(공용 언어 런타임) 개체 디버깅을 지원합니다. SQL Server에서 디버깅의 주요 측면은 설치 및 사용의 용이성과 MICROSOFT Visual Studio 디버거와 SQL Server 디버거의 통합입니다. 또한 디버깅이 여러 언어에서 작동합니다. 사용자는 Transact-SQL에서 CLR 개체로 원활하게 단계별로 실행할 수 있으며 그 반대의 경우도 마찬가지입니다. SQL Server Management Studio의 Transact-SQL 디버거는 관리되는 데이터베이스 개체를 디버그하는 데 사용할 수 없지만 Visual Studio에서 디버거를 사용하여 개체를 디버그할 수 있습니다. Visual Studio에서 관리되는 데이터베이스 개체 디버깅은 서버에서 실행되는 루틴 내에서 "단계별 실행" 및 "단계별 실행" 문과 같은 모든 일반적인 디버깅 기능을 지원합니다. 디버거는 디버깅하는 동안 중단점을 설정하고, 호출 스택을 검사하고, 변수를 검사하고, 변수 값을 수정할 수 있습니다.

참고 항목

VISUAL Studio .NET 2003은 CLR 통합 프로그래밍 또는 디버깅에 사용할 수 없습니다. SQL Server에는 .NET Framework가 미리 설치되어 있으며 Visual Studio .NET 2003에서는 .NET Framework 2.0 어셈블리를 사용할 수 없습니다.

권한 및 제한 사항 디버깅

디버깅은 권한이 높은 작업이므로 Sysadmin 고정 서버 역할의 멤버만 SQL Server에서 수행할 수 있습니다.

디버깅하는 동안 적용되는 제한 사항은 다음과 같습니다.

  • CLR 루틴 디버깅은 한 번에 하나의 디버거 인스턴스로 제한됩니다. 이 제한이 적용되는 이유는, 중단점에 도달하면 모든 CLR 코드 실행이 중지되고 이 중단점에서 디버거가 전진할 때까지 실행이 멈추기 때문입니다. 그러나 다른 연결에서 Transact-SQL 디버깅을 계속할 수 있습니다. Transact-SQL 디버깅은 서버에서 다른 실행을 중지하지 않지만 잠금을 유지하여 다른 연결이 대기할 수 있습니다.

  • SQL Server는 연결을 만들기 전에 클라이언트 및 디버거 환경에 대한 정보가 필요하므로 기존 연결을 디버그할 수 없으며 새 연결만 디버그할 수 없습니다.

위의 제한 사항으로 인해 프로덕션 서버가 아닌 테스트 서버에서 Transact-SQL 및 CLR 코드를 디버그하는 것이 좋습니다.

개요

SQL Server의 디버깅은 연결별 모델을 따릅니다. 디버거는 자신이 연결된 클라이언트 연결에 대해서만 작업을 감지하고 디버깅할 수 있습니다. 디버거의 기능은 연결 유형에 의해 제한되지 않으므로 TDS(테이블 형식 데이터 스트림)와 HTTP 연결을 모두 디버그할 수 있습니다. 그러나 SQL Server는 기존 연결 디버깅을 허용하지 않습니다. 디버깅은 서버에서 실행되는 루틴 내에서 모든 일반적인 디버깅 기능을 지원합니다. 디버거와 SQL Server 간의 상호 작용은 COM(분산 구성 요소 개체 모델)을 통해 수행됩니다.

관리되는 저장 프로시저, 함수, 트리거, 사용자 정의 형식 및 집계를 디버깅하는 방법에 대한 자세한 내용 및 시나리오는 Visual Studio 설명서의 SQL Server CLR Integration Database 디버깅을 참조하세요.

원격 개발, 디버깅 및 개발에 Visual Studio를 사용하려면 SQL Server 인스턴스에서 TCP/IP 네트워크 프로토콜을 사용하도록 설정해야 합니다. 서버에서 TCP/IP 프로토콜을 사용하도록 설정하는 방법에 대한 자세한 내용은 클라이언트 프로토콜 구성을 참조 하세요.

디버깅 단계

다음 단계를 사용하여 Microsoft Visual Studio에서 CLR 데이터베이스 개체를 디버그합니다.

  1. Microsoft Visual Studio를 열고 새 SQL Server 프로젝트를 만듭니다. Visual Studio와 함께 제공되는 SQL LocalDB 인스턴스를 사용할 수 있습니다.

  2. 새 SQL CLR 형식(C#)을 만듭니다.

    1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가, 새 항목...을 선택합니다.
    2. 새 항목 추가 창에서 SQL CLR C# 저장 프로시저, SQL CLR C# 사용자 정의 함수, SQL CLR C# 사용자 정의 형식, SQL CLR C# 트리거, SQL CLR C# 집계 또는 클래스를 선택합니다.
    3. 새 형식의 원본 파일 이름을 지정한 다음 추가를 선택합니다.
  3. 텍스트 편집기에서 새 형식에 대한 코드를 추가합니다. 예제 저장 프로시저에 대한 샘플 코드는 이 문서의 다음 예제 섹션을 참조하세요.

  4. 형식을 테스트하는 스크립트를 추가합니다.

    1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 추가, 스크립트...를 선택합니다.
    2. 새 항목 추가 창에서 스크립트(빌드에 없음)를 선택하고 다음과 같은 Test.sql이름을 지정합니다. 추가 단추를 선택합니다.
    3. 솔루션 탐색기에서 노드를 Test.sql 두 번 클릭하여 기본 테스트 스크립트 원본 파일을 엽니다.
    4. 테스트 스크립트(디버그할 코드를 호출하는 스크립트)를 텍스트 편집기에 추가합니다. 샘플 스크립트는 다음 섹션의 예제를 참조하세요.
  5. 원본 코드에 중단점을 하나 이상 배치합니다. 디버그하려는 함수 또는 루틴의 텍스트 편집기에서 코드 줄을 마우스 오른쪽 단추로 클릭합니다. 중단점을 선택하고 중단점을 삽입합니다. 중단점이 추가되고 코드 줄이 빨간색으로 강조 표시됩니다.

  6. 디버그 메뉴에서 디버깅 시작을 선택하여 프로젝트를 컴파일, 배포 및 테스트합니다. 테스트 스크립트 Test.sql 가 실행되고 관리되는 데이터베이스 개체가 호출됩니다.

  7. 중단점에 노란색 화살표(명령 포인터 지정)가 나타나면 코드 실행이 일시 중지됩니다. 그런 다음 관리되는 데이터베이스 개체를 디버그할 수 있습니다.

    1. 디버그 메뉴에서 한 단계씩 실행하여 명령 포인터를 다음 코드 줄로 진행합니다.
    2. 로컬 창을 사용하여 명령 포인터로 현재 강조 표시된 개체의 상태를 관찰합니다.
    3. 조사식 창에 변수를 추가합니다. 변수가 명령 포인터로 현재 강조 표시된 코드 줄에 없는 경우에도 디버깅 세션 전체에서 감시된 변수의 상태를 관찰할 수 있습니다.
    4. 디버그 메뉴에서 [계속]을 선택하여 명령 포인터를 다음 중단점으로 이동하거나 중단점이 더 이상 없는 경우 루틴 실행을 완료합니다.

예제 코드

다음 예제에서는 SQL Server 버전을 호출자에게 반환합니다.

using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void GetVersion()
    {
        using (var connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            var command = new SqlCommand("select @@version", connection);
            SqlContext.Pipe.ExecuteAndSend(command);
        }
    }
}

테스트 스크립트 예제

다음 테스트 스크립트는 이전 예제에 정의된 저장 프로시저를 GetVersion 호출하는 방법을 보여줍니다.

EXEC GetVersion  

다음 단계

Visual Studio를 사용하여 관리 코드를 디버깅하는 방법에 대한 자세한 내용은 Visual Studio 설명서의 관리 코드 디버깅을 참조하세요.

자세한 내용은 공용 언어 런타임 통합 프로그래밍 개념을 참조 하세요.