연습: 기존 데이터베이스의 Transact-SQL 코드 분석

데이터베이스 스키마의 Transact-SQL 코드를 데이터베이스 프로젝트로 가져온 다음 규칙 집합을 기준으로 코드를 분석하여 코드 품질을 향상시킬 수 있습니다. 예를 들어 반드시 사용해야 하지만 사용자가 개발하지 않았고 품질을 확인하지 않은 스키마에서 오류를 찾을 수 있습니다. 자세한 내용은 데이터베이스 코드를 분석하여 코드 품질 향상을 참조하십시오.

데이터베이스 코드를 분석하려면 먼저 기존 데이터베이스의 스키마를 데이터베이스 프로젝트로 가져와야 합니다. 이 프로젝트에는 품질 수준을 알 수 없는 코드가 포함되어 있습니다. 정적 코드 분석에 사용할 수 있는 모든 규칙을 적용하여 Transact-SQL 코드를 분석할 수 있습니다. 나중에 팀에 대해 일부 규칙을 해제할 수 있지만 이 초기 평가에서는 데이터베이스 코드의 모든 잠재적 문제를 찾을 수 있습니다. 경고와 해당 경고를 발생시킨 코드를 검토해야 합니다. 그런 다음 경고를 수정하거나 추가 경고를 표시하지 않도록 설정하고 데이터베이스 프로젝트를 다시 분석할 수 있습니다.

사전 요구 사항

이 연습을 완료하려면 먼저 연습: 버전 제어에서 기존 데이터베이스 스키마 관리를 완료해야 합니다. 이 선행 연습에서는 MyAdvWorks라는 데이터베이스 프로젝트가 있는 솔루션을 만듭니다.

데이터베이스 프로젝트를 분석하기 위한 규칙을 구성하려면

  1. Visual Studio에서 MyAdvWorks 솔루션을 엽니다.

  2. 스키마 뷰에서 데이터베이스 프로젝트 노드를 아직 확장하지 않은 경우 확장합니다.

  3. 데이터 메뉴에서 정적 코드 분석을 가리키고 구성을 클릭합니다.

    데이터베이스 프로젝트에 대한 코드 분석 속성이 나타납니다.

  4. 규칙 목록에서 "디자인", "명명" 및 "성능" 노드를 확장하여 Transact-SQL 코드를 분석하는 데 사용할 수 있는 모든 규칙을 표시합니다.

  5. 모든 규칙의 확인란이 선택되어 있는지 확인합니다.

    "디자인"과 같은 규칙 범주의 확인란을 선택하거나 선택 취소하여 해당 범주의 각 규칙에 대한 확인란을 선택하거나 선택 취소할 수 있습니다.

    참고

    규칙에 대한 경고를 오류로 처리 확인란을 선택하면 해당 규칙을 경고 대신 오류로 처리할 수 있습니다.

  6. 파일 메뉴에서 모두 저장을 클릭합니다.

    다음에는 데이터베이스 프로젝트의 Transact-SQL 코드를 분석합니다. 이 연습에서는 분석을 수동으로 시작하지만 데이터베이스를 성공적으로 빌드한 후마다 분석이 시작되도록 구성할 수도 있습니다. 자세한 내용은 방법: 데이터베이스 코드에 대한 정적 분석 활성화 및 비활성화를 참조하십시오.

데이터베이스 프로젝트를 분석하려면

  • 데이터 메뉴에서 정적 코드 분석을 가리키고 실행을 클릭합니다.

    데이터베이스 프로젝트의 Transact-SQL 코드가 분석되고 오류 목록에 경고가 표시됩니다. 오류 목록이 표시되지 않으면 보기 메뉴를 열고 오류 목록을 클릭합니다.

    다음에는 경고 중 하나를 보고 수정합니다.

경고를 보고 수정하려면

  1. 오류 목록에서 다음 경고를 찾습니다.

    SR0014 : Microsoft.Rules.Data: ASCII String(1)에서 SmallInt(으)로 캐스팅할 때 데이터가 손실될 수 있습니다.

    이 경고를 발생시킨 코드는 "ufnGetStock.function.sql"이라는 파일에 있습니다. 줄 12, 열 30에서 이 코드를 찾을 수 있습니다.

  2. 오류 목록에서 이 경고를 마우스 오른쪽 단추로 클릭하고 오류 도움말 표시를 클릭합니다.

    규칙 SR0014에 대한 도움말 항목이 나타납니다. 이 항목에서 해당 규칙이 트리거된 원인, 경고를 해결하는 방법 및 경고를 무시할 수 있는 경우에 대해 알아볼 수 있습니다. 이 경고를 발생시키는 Transact-SQL 코드 예제와 이 경고를 해결하는 코드 업데이트도 볼 수 있습니다.

  3. 오류 목록에서 경고를 두 번 클릭하거나 경고를 강조 표시하고 Enter 키를 누릅니다.

    Transact-SQL 편집기가 열리고 경고 발생의 원인이 된 코드가 표시됩니다. 경고를 발생시킨 코드의 시작 부분에 커서가 표시됩니다. 이 경우 정수 열인 LocationID를 단일 문자 상수 '6'과 비교하기 때문에 커서가 FROM 절에 나타납니다. 다음과 같은 코드가 표시됩니다.

    CREATE FUNCTION [dbo].[ufnGetStock](@ProductID [int])
    RETURNS [int] 
    AS 
    -- Returns the stock level for the product. This function is used internally only
    BEGIN
        DECLARE @ret int;
    
        SELECT @ret = SUM(p.[Quantity]) 
        FROM [Production].[ProductInventory] p 
        WHERE p.[ProductID] = @ProductID 
            AND p.[LocationID] = '6'; -- Only look at inventory in the misc storage
    
        IF (@ret IS NULL) 
            SET @ret = 0
    
        RETURN @ret
    END;
    
    GO
    EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Scalar function returning the quantity of inventory in LocationID 6 (Miscellaneous Storage)for a specified ProductID.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock';
    
    
    GO
    EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'Input parameter for the scalar function ufnGetStock. Enter a valid ProductID from the Production.ProductInventory table.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'FUNCTION', @level1name = N'ufnGetStock', @level2type = N'PARAMETER', @level2name = N'@ProductID';
    
  4. SELECT 문의 코드를 다음 예제와 일치하도록 업데이트합니다.

        SELECT @ret = SUM(p.[Quantity]) 
        FROM [Production].[ProductInventory] p 
        WHERE p.[ProductID] = @ProductID 
            AND p.[LocationID] = 6; -- Only look at inventory in the misc storage
    
  5. 파일 메뉴에서 ufnGetStock.function.sql 저장을 클릭합니다.

    다음에는 두 번째 경고를 검토하고 이를 표시하지 않도록 설정합니다.

코드 분석 경고를 보고 이를 표시하지 않도록 설정하려면

  1. 오류 목록에서 다음 경고를 찾습니다.

    SR0011 : Microsoft.Rules.Data: Object name(Database Version) contains special characters.

    이 경고를 발생시킨 코드는 "AWBuildVersion.table.sql"이라는 파일에 있습니다. 줄 3, 열 5에서 이 코드를 찾을 수 있습니다.

    이 시점에서는 개체 이름에서 특수 문자를 제거할지 여부를 결정해야 합니다. 데이터베이스 리팩터링을 사용하면 이 개체에 대한 모든 참조에 올바른 이름이 포함되도록 자동으로 업데이트할 수 있습니다. 하지만 기존 이름을 사용하는 응용 프로그램에는 문제가 발생합니다. 최상의 방법을 결정하기 위한 충분한 정보가 없으면 변경 결과에 대한 조사를 마칠 때까지 경고를 표시하지 않을 수 있습니다. Visual Studio Team Foundation Server에 작업 항목을 만들어 이 작업을 추적하거나 다른 개발자에게 작업을 할당할 수도 있습니다.

  2. 오류 목록에서 설명 열의 머리글을 클릭합니다.

    오류 목록의 경고가 설명을 기준으로 정렬되어 모든 SR0011 경고가 한 그룹으로 묶입니다.

  3. SR0011 경고가 표시될 때까지 오류 목록을 스크롤한 다음 이 경고를 강조 표시합니다.

    여러 경고를 무시하려는 경우 목록에서 해당되는 첫 번째 경고를 클릭한 다음 Shift 키를 누른 채 해당되는 마지막 경고를 클릭하여 연속된 경고 목록을 강조 표시할 수 있습니다.

    참고

    강조 표시된 행을 마우스 오른쪽 단추로 클릭하고 작업 항목 만들기를 가리킨 다음 작업 항목 형식을 클릭하면 이 목록에서 작업 항목을 만들 수 있습니다. 이름을 변경할 수 있을 때까지 경고를 표시하지 않을 경우에는 이름이 변경된 후 경고를 다시 표시하기 위한 지침을 작업 항목에 포함해야 합니다. 여기에서는 연습을 간단하게 하기 위해 작업 항목을 만드는 단계는 생략합니다.

  4. 강조 표시된 행을 마우스 오른쪽 단추로 클릭하고 정적 코드 분석 메시지 표시 안 함을 클릭합니다.

    StaticCodeAnalysis.SuppressMessages.xml이라는 파일이 데이터베이스 프로젝트에 추가됩니다. MyAdvWorks.dbproj 파일은 버전 제어에서 체크 아웃됩니다. 표시하지 않도록 설정한 경고는 오류 목록에서 사라져 목록의 경고 수가 줄어듭니다.

    참고

    데이터베이스 프로젝트의 파일에 대한 경고를 표시하지 않도록 설정할 경우 이 파일에 대해 해당 경고의 모든 인스턴스가 표시되지 않습니다.

    XML 파일에는 표시하지 않도록 설정한 경고의 목록이 포함되어 있습니다. 표시하지 않도록 설정한 모든 경고를 다시 표시하려면 이 파일을 삭제하면 됩니다. 자세한 내용은 방법: 데이터베이스 코드 분석에 대한 경고 표시 안 함 중지를 참조하십시오.

    마지막 절차에서는 데이터베이스 프로젝트를 다시 분석합니다.

데이터베이스 프로젝트를 다시 분석하려면

  • 데이터 메뉴에서 정적 코드 분석을 가리키고 실행을 클릭합니다.

    데이터베이스 프로젝트의 Transact-SQL 코드가 다시 분석되고 오류 목록에 나머지 경고가 표시됩니다. 수정한 경고나 표시하지 않도록 설정한 경고는 표시되지 않습니다.

다음 단계

일반적인 환경에서는 오류 목록에 표시된 각 경고를 분석하게 됩니다. 그런 다음 즉시 수정할 수 있는 문제는 수정하고, 무시할 수 있는 문제는 표시하지 않도록 설정하고, 나중에 수정해야 하는 문제에 대해서는 작업 항목을 만듭니다. 일부 문제의 경우 데이터베이스 리팩터링을 사용하여 경고를 해결할 수 있습니다. 데이터베이스 리팩터링에 대한 자세한 내용은 데이터베이스 코드 및 데이터 리팩터링을 참조하십시오.

각 경고를 해결하거나 표시하지 않도록 설정한 후에는 데이터베이스 단위 테스트와 응용 프로그램 테스트를 실행하여 변경 내용으로 인해 문제가 발생하지 않았는지 확인해야 합니다. 데이터베이스 단위 테스트에 대한 자세한 내용은 단위 테스트를 사용하여 데이터베이스 코드 확인을 참조하십시오.

참고 항목

개념

데이터베이스 코드를 분석하여 코드 품질 향상