다음을 통해 공유


데이터베이스와 프로젝트 비교

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

데이터베이스와 SQL 프로젝트 간의 개체 정의 차이를 이해하면 진행 중인 개발 또는 회귀 문제 해결을 포함하여 데이터베이스 및 프로젝트의 상태에 대한 중요한 인사이트를 제공할 수 있습니다. SQL 프로젝트에는 차이점을 시각화하는 도구, 데이터베이스 업데이트에 필요한 변경 내용 분석, 데이터베이스에서 SQL 프로젝트 파일 집합으로 변경 내용 가져오기, 프로젝트와 일치하도록 데이터베이스를 업데이트하기 위해 실행될 T-SQL 스크립트 검토가 포함됩니다.

이 문서에서는 다른 방법을 사용하여 데이터베이스와 SQL 프로젝트를 비교하는 방법을 검토합니다.

  • 스키마 비교를 사용하여 데이터베이스 및/또는 프로젝트 간의 차이를 시각화할 수 있습니다. 이 비교는 데이터베이스와 프로젝트 간에 동기화해야 하는 변경 내용을 식별하는 데 도움이 될 수 있습니다.
  • 배포 보고서를 사용하여 데이터베이스를 업데이트하는 데 필요한 변경 내용을 요약하고 검토를 자동화할 수 있습니다.
  • 스키마 비교 또는 SqlPackage 추출을 사용하여 SQL 프로젝트 파일 집합으로 데이터베이스의 변경 내용을 가져올 수 있습니다.
  • SqlPackage 배포 스크립트 또는 스키마 비교 를 사용하여 실행된 T-SQL 문을 검토하여 프로젝트와 일치하도록 데이터베이스를 업데이트할 수 있습니다.

스키마 비교: 차이점 시각화

필수 조건

그래픽 스키마 비교는 Visual Studio의 SDK 스타일 SQL 프로젝트 미리 보기에서 아직 사용할 수 없습니다. Azure Data Studio 또는 Visual Studio를 사용하여 스키마를 비교합니다.

스키마 비교에는 Visual Studio 또는 Azure Data Studio와 같은 그래픽 도구가 필요합니다.

요약

스키마 비교는 데이터베이스와 프로젝트의 차이점을 이해하는 시각적으로 가장 풍부한 인터페이스를 제공합니다. 스키마 비교의 주요 기능은 비교의 방향성을 되돌릴 수 있다는 것입니다. 따라서 스키마 비교를 사용하여 데이터베이스에 배포할 프로젝트의 변경 내용 또는 프로젝트에 추가할 데이터베이스의 변경 내용을 이해할 수 있습니다. 스키마 비교를 사용하여 테이블, 뷰, 저장 프로시저 및 함수와 같은 개체 정의의 차이를 식별할 수 있습니다.

전체 차이점 집합 또는 선택한 하위 집합을 사용하여 변경 내용을 데이터베이스 또는 프로젝트에 적용할 수 있습니다. 스키마 비교는 실행 시 변경 내용을 데이터베이스에 효과적으로 적용하는 배포 스크립트를 생성할 수도 있습니다.

스키마 비교 개요에서 스키마 비교에 대해 자세히 알아봅니다.

보고서 배포: 변경 내용 검토

보고서를 배포하려면 SqlPackage CLI가 필요합니다.

dotnet tool install -g Microsoft.SqlPackage

요약

배포 보고서는 프로젝트와 일치하도록 데이터베이스를 업데이트하는 데 필요한 변경 내용의 요약을 제공합니다. SqlPackage CLI는 원본 모델(.dacpac SQL 프로젝트 빌드 아티팩트 또는 데이터베이스)과 대상 데이터베이스를 비교하여 배포 보고서를 생성합니다. 예를 들어 다음 명령은 이름이 MyProject로 명명된 SQL 프로젝트에서 MyDatabase 데이터베이스에 대한 배포 보고서를 생성합니다.

dotnet build MyProject.sqlproj
sqlpackage /Action:deployreport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /OutputPath:deployreport.xml

생성된 XML은 데이터베이스 배포가 실행되는 경우 수행될 작업을 요약하여 배포 계획의 간소화된 형태입니다. 다음 작업 목록은 완전하지 않습니다.

  • Create
  • Alter
  • Drop
  • Refresh
  • UnbindSchemaBinding
  • UnbindFulltextIndex
  • TableDataMotion
  • SPRename
  • EnableChangeTrackingDatabase
  • DisableChangeTrackingDatabase

배포 보고서는 텍스트 편집기 또는 Visual Studio에서 검토할 수 있으며 다음과 유사합니다.

<?xml version="1.0" encoding="utf-8"?>
<DeploymentReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DeployReport/2012/02">
    <Alerts />
    <Operations>
        <Operation Name="Create">
            <Item Value="[CO].[Products].[IX_Products_CategorySlug]" Type="SqlIndex" />
        </Operation>
        <Operation Name="Alter">
            <Item Value="[CO].[Brands]" Type="SqlTable" />
            <Item Value="[CO].[AddProductImage]" Type="SqlProcedure" />
        </Operation>
        <Operation Name="Refresh">
            <Item Value="[CO].[SelectStarView]" Type="SqlView" />
        </Operation>
    </Operations>
</DeploymentReport>

배포 보고서를 사용하여 변경 내용을 검토하고 데이터 동작 또는 클러스터형 인덱스 만들기/삭제와 같은 잠재적으로 높은 영향을 미치는 이벤트를 모니터링할 수 있습니다. 이러한 이벤트는 Alerts 요소 아래 배포 보고서에 나열됩니다.

보고서 XML 배포 작업의 장점은 데이터베이스를 업데이트하는 데 필요한 변경 내용 검토를 자동화하는 데 사용할 수 있다는 것입니다. XML을 구문 분석하여 보고서를 생성하거나 나열된 작업 또는 개체 이름에 따라 경고를 트리거하는 데 사용할 수 있습니다.

데이터베이스에서 변경 내용 가져오기

스키마 비교 섹션에서 설명한 대로 스키마 비교를 사용하여 데이터베이스의 변경 내용을 SQL 프로젝트 파일 집합에 적용할 수 있습니다. SQL 프로젝트에 변경 내용을 적용하는 것은 직접 개발된 데이터베이스가 있고 SQL 프로젝트를 사용하여 소스 제어에서 데이터베이스 개체를 관리하는 일반적인 시나리오입니다. Visual Studio 또는 Azure Data Studio를 통해 이 작업을 수동으로 완료하는 것은 특히 데이터베이스에 많은 개체 또는 산발적인 변경 내용이 있는 경우 시간이 오래 걸릴 수 있습니다. 이 섹션에서는 데이터베이스에서 SQL 프로젝트 파일 집합으로 개체 정의 추출을 자동화하는 방법을 검토합니다.

필수 조건

자동화에 중점을 두고 SqlPackage CLI를 활용하여 데이터베이스의 개체 정의를 SQL 프로젝트 파일 집합으로 추출합니다. Microsoft.Build.Sql.Templates .NET 템플릿은 선택적 단계인 SQL 프로젝트 파일을 만드는 데 사용됩니다.

# install SqlPackage CLI
dotnet tool install -g Microsoft.SqlPackage

# install Microsoft.Build.Sql.Templates
dotnet new install Microsoft.Build.Sql.Templates

요약

SqlPackage 추출 명령은 원본 데이터베이스를 사용하고 .dacpac 파일 또는 SQL 스크립트 집합으로 출력 데이터베이스 모델을 생성합니다. SqlPackage 는 기본적으로 .dacpac 파일을 생성하지만 /p:ExtractTarget= 속성을 사용하여 SQL 스크립트 집합을 지정할 수 있습니다. 다음 명령은 데이터베이스 MyDatabase을(를) 폴더 MyDatabaseProject의 SQL 프로젝트 파일 집합으로 추출합니다.

sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType

폴더가 소스 제어에 있는 경우 추출된 개체 정의는 소스 제어 도구의 차이를 표시합니다. SqlPackage를 사용하여 파일을 생성하고 소스 제어의 차이점을 확인하면 데이터베이스에서 SQL 프로젝트 파일 집합으로 변경 내용을 가져오는 프로세스를 자동화할 수 있습니다.

일련의 세 명령에서 이전 파일 집합을 제거하고, 데이터베이스를 추출하고, 소스 제어 도구의 차이점을 확인할 수 있습니다.

rm -rf MyDatabaseProject
sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
git status --porcelain | wc -l

출력은 최신 SqlPackage 추출에 의해 변경된 파일 수입니다. git status 명령의 출력을 사용하여 다른 자동화 단계를 트리거할 수 있습니다. 이 파일 집합을 SQL 프로젝트로 사용하려는 경우 Microsoft.Build.Sql.Templates .NET 템플릿을 사용하여 폴더 MyDatabaseProject에 SQL 프로젝트 파일을 만들 수 있습니다.

dotnet new sqlproj -n MyDatabaseProject -o MyDatabaseProject

배포 T-SQL 스크립트 검토

스키마 비교 섹션에서 설명한 것처럼 스키마 비교를 사용하여 SQL 프로젝트와 일치하도록 데이터베이스를 업데이트하는 데 필요한 T-SQL 스크립트를 생성할 수 있습니다. 이 섹션에서는 검토 및 승인을 위해 파이프라인 아티팩트로 저장할 수 있도록 SQL 프로젝트와 일치하도록 데이터베이스를 업데이트하는 데 필요한 T-SQL 스크립트 생성을 자동화하는 SqlPackage 사용 방법을 검토합니다.

필수 조건

dotnet tool install -g Microsoft.SqlPackage

요약

SqlPackage를 사용하여 SQL 프로젝트 배포를 실행하면 게시 작업이 사용되지만 실행되는 T-SQL 스크립트를 검토하려는 경우 스크립트 작업을 사용할 수 있습니다. 다음 명령은 MyProject(으)로 명명된 SQL 프로젝트와 일치하도록 MyDatabase 데이터베이스를 업데이트하는 데 필요한 T-SQL 스크립트를 생성합니다.

dotnet build MyProject.sqlproj
sqlpackage /Action:Script /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /DeployScriptPath:Deployment.sql