연습: 데이터베이스 및 데이터베이스 프로젝트의 스키마 비교

이 항목은 다음 언어에 적용됩니다.

Visual Studio Ultimate

Visual Studio Premium

Visual Studio Professional 

Visual Studio Express

항목이 적용됨 항목이 적용됨 항목이 적용되지 않음 항목이 적용되지 않음

이 연습에서는 Visual Studio를 사용하여 데이터베이스 프로젝트의 스키마를 데이터베이스의 스키마와 비교합니다. 팀에서 데이터베이스 프로젝트 및 데이터베이스를 사용하는 방법에 따라 한 방향이나 다른 방향으로 스키마 변경 내용을 복사할 수 있습니다. 팀에서 데이터베이스 개발 수명 주기가 진행되는 동안 다음과 같은 일반적인 경우가 발생할 수 있습니다.

  • 프로젝트가 소스이고 데이터베이스가 대상인 경우: 데이터베이스 프로젝트를 사용하여 데이터베이스를 개발하거나 유지 관리할 수 있습니다. 프로젝트의 스키마를 변경한 후 스테이징 서버에 호스팅된 데이터베이스로 변경 내용을 복사합니다. 나중에 팀에서 데이터베이스를 프로덕션 서버로 배포할 수 있습니다.

    이 연습에서 수행하는 비교 작업은 스키마 차이로부터 DDL(데이터 정의 언어) 스크립트를 생성합니다. 그런 다음 이 스크립트를 사용하여 데이터베이스 프로젝트의 모두 또는 일부를 데이터베이스에 적용할 수 있습니다. 자세한 내용은 프로젝트에서 데이터베이스로 변경 내용 전파를 참조하십시오.

  • 데이터베이스가 소스이고 프로젝트가 대상인 경우: 프로덕션 데이터베이스의 스키마에 오류가 있거나, 스키마가 오래되어 업데이트가 필요할 수 있습니다. 이 경우 팀에서 데이터베이스에 긴급 업데이트를 적용해야 할 수 있습니다. 프로젝트와 데이터베이스 간의 동기화 상태를 유지하려면 이 업데이트를 데이터베이스 프로젝트로 가져옵니다. 자세한 내용은 방법: 데이터베이스에서 데이터베이스 프로젝트로 업데이트 가져오기를 참조하십시오.

이 연습에서는 다음 작업을 수행합니다.

설치 단계

  1. 데이터베이스 프로젝트를 만듭니다. 빈 새 프로젝트가 시작됩니다.

  2. 스크립트에서 데이터베이스 스키마를 가져옵니다.

  3. 데이터베이스 프로젝트를 구성 및 빌드하고 데이터베이스 서버에 배포합니다. 데이터베이스와 프로젝트에는 동일한 스키마가 있습니다.

프로덕션 단계

  1. 데이터베이스 프로젝트에 테이블을 추가합니다. 세 개의 열로 구성된 InternationalShippers라는 테이블을 추가합니다.

  2. 두 스키마를 비교합니다. 이 비교에서 데이터베이스 프로젝트를 소스로 지정하고 데이터베이스를 대상으로 지정합니다. 따라서 결과에는 InternationalShippers 테이블이 데이터베이스 프로젝트의 새 테이블로 표시됩니다.

  3. 프로젝트에서 데이터베이스로 변경 내용을 전파합니다. 데이터베이스 프로젝트의 새 InternationalShippers 테이블을 배포된 데이터베이스에 전파할 수 있습니다. 이 절차를 따르면 예제 데이터베이스의 일부를 덮어쓰게 됩니다.

    참고

    데이터베이스에서 데이터베이스 프로젝트로 변경 내용을 전파할 수도 있습니다. 자세한 내용은 방법: 데이터베이스에서 데이터베이스 프로젝트로 업데이트 가져오기를 참조하십시오.

사전 요구 사항

이 연습을 완료하려면 다음과 같은 응용 프로그램 및 사용 권한이 필요합니다.

  • SQL Server 2008

  • 대상 데이터베이스 서버에서 데이터베이스를 만들고 업데이트할 수 있는 권한

  • Visual Studio Premium 또는 Visual Studio Ultimate

설치 단계

데이터베이스 프로젝트 만들기

데이터베이스 프로젝트를 만들려면

  1. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.

    새 프로젝트 대화 상자가 열립니다.

  2. 설치된 템플릿에서 데이터베이스 노드를 확장하고 SQL Server를 클릭합니다.

  3. 템플릿 목록에서 SQL Server 2008 데이터베이스 프로젝트를 클릭합니다.

  4. 이름에 CompareProject를 입력한 다음 확인을 클릭합니다.

    비어 있는 CompareProject 프로젝트가 솔루션 탐색기에서 열립니다.

스크립트에서 데이터베이스 스키마 가져오기

스키마를 가져올 수 있는 원본 스크립트를 만들려면

  1. 파일 메뉴에서 새로 만들기를 가리키고 파일을 클릭합니다.

    새 파일 대화 상자가 열립니다.

  2. 범주 목록에서 일반이 아직 강조 표시되지 않은 경우 클릭합니다.

  3. 템플릿 목록에서 SQL 파일을 클릭한 다음 열기를 클릭합니다.

    Transact-SQL 편집기가 열립니다.

  4. 다음 코드를 복사하여 Transact-SQL 편집기에 붙여넣습니다.

    PRINT N'Creating Sales...';
    GO
    CREATE SCHEMA [Sales]
        AUTHORIZATION [dbo];
    GO
    PRINT N'Creating Sales.Customer...';
    GO
    CREATE TABLE [Sales].[Customer] (
        [CustomerID]   INT IDENTITY (1, 1) NOT NULL,
        [CustomerName] NVARCHAR (40) NOT NULL,
        [YTDOrders] INT NOT NULL,
        [YTDSales] INT NOT NULL
    );
    GO
    PRINT N'Creating Sales.Orders...';
    GO
    CREATE TABLE [Sales].[Orders] (
        [CustomerID] INT NOT NULL,
        [OrderID] INT IDENTITY (1, 1) NOT NULL,
        [OrderDate] DATETIME NOT NULL,
        [FilledDate] DATETIME NULL,
        [Status] CHAR (1) NOT NULL,
        [Amount] INT NOT NULL
    );
    GO
    PRINT N'Creating Sales.Def_Customer_YTDOrders...';
    GO
    ALTER TABLE [Sales].[Customer]
        ADD CONSTRAINT [Def_Customer_YTDOrders] DEFAULT 0 FOR [YTDOrders];
    GO
    PRINT N'Creating Sales.Def_Customer_YTDSales...';
    GO
    ALTER TABLE [Sales].[Customer]
        ADD CONSTRAINT [Def_Customer_YTDSales] DEFAULT 0 FOR [YTDSales];
    GO
    PRINT N'Creating Sales.Def_Orders_OrderDate...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [Def_Orders_OrderDate] DEFAULT GetDate() FOR [OrderDate];
    GO
    PRINT N'Creating Sales.Def_Orders_Status...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [Def_Orders_Status] DEFAULT 'O' FOR [Status];
    GO
    PRINT N'Creating Sales.PK_Customer_CustID...';
    GO
    ALTER TABLE [Sales].[Customer]
        ADD CONSTRAINT [PK_Customer_CustID] PRIMARY KEY CLUSTERED ([CustomerID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);
    GO
    PRINT N'Creating Sales.PK_Orders_OrderID...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [PK_Orders_OrderID] PRIMARY KEY CLUSTERED ([OrderID] ASC) WITH (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON, PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF);
    GO
    PRINT N'Creating Sales.FK_Orders_Customer_CustID...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [FK_Orders_Customer_CustID] FOREIGN KEY ([CustomerID]) REFERENCES [Sales].[Customer] ([CustomerID]) ON DELETE NO ACTION ON UPDATE NO ACTION;
    GO
    PRINT N'Creating Sales.CK_Orders_FilledDate...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [CK_Orders_FilledDate] CHECK ((FilledDate >= OrderDate) AND (FilledDate < '01/01/2010'));
    GO
    PRINT N'Creating Sales.CK_Orders_OrderDate...';
    GO
    ALTER TABLE [Sales].[Orders]
        ADD CONSTRAINT [CK_Orders_OrderDate] CHECK ((OrderDate > '01/01/2005') and (OrderDate < '01/01/2020'));
    GO
    PRINT N'Creating Sales.uspCancelOrder...';
    GO
    CREATE PROCEDURE [Sales].[uspCancelOrder]
    @OrderID INT
    AS
    BEGIN
    DECLARE @Delta INT, @CustomerID INT
    BEGIN TRANSACTION
        SELECT @Delta = [Amount], @CustomerID = [CustomerID]
         FROM [Sales].[Orders] WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Orders]
       SET [Status] = 'X'
    WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Customer]
       SET
       YTDOrders = YTDOrders - @Delta
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    END
    GO
    PRINT N'Creating Sales.uspFillOrder...';
    GO
    CREATE PROCEDURE [Sales].[uspFillOrder]
    @OrderID INT, @FilledDate DATETIME
    AS
    BEGIN
    DECLARE @Delta INT, @CustomerID INT
    BEGIN TRANSACTION
        SELECT @Delta = [Amount], @CustomerID = [CustomerID]
         FROM [Sales].[Orders] WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Orders]
       SET [Status] = 'F',
           [FilledDate] = @FilledDate
    WHERE [OrderID] = @OrderID;
    
    UPDATE [Sales].[Customer]
       SET
       YTDSales = YTDSales - @Delta
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    END
    GO
    PRINT N'Creating Sales.uspNewCustomer...';
    GO
    CREATE PROCEDURE [Sales].[uspNewCustomer]
    @CustomerName NVARCHAR (40)
    AS
    BEGIN
    INSERT INTO [Sales].[Customer] (CustomerName) VALUES (@CustomerName);
    SELECT SCOPE_IDENTITY()
    END
    GO
    PRINT N'Creating Sales.uspPlaceNewOrder...';
    GO
    CREATE PROCEDURE [Sales].[uspPlaceNewOrder]
    @CustomerID INT, @Amount INT, @OrderDate DATETIME, @Status CHAR (1)='O'
    AS
    BEGIN
    DECLARE @RC INT
    BEGIN TRANSACTION
    INSERT INTO [Sales].[Orders] (CustomerID, OrderDate, FilledDate, Status, Amount) 
         VALUES (@CustomerID, @OrderDate, NULL, @Status, @Amount)
    SELECT @RC = SCOPE_IDENTITY();
    UPDATE [Sales].[Customer]
       SET
       YTDOrders = YTDOrders + @Amount
        WHERE [CustomerID] = @CustomerID
    COMMIT TRANSACTION
    RETURN @RC
    END
    GO
    
  5. 파일 메뉴에서 다른 이름으로 SqlQuery_1.sql 저장을 클릭합니다.

    다른 이름으로 파일 저장 대화 상자가 열립니다.

  6. 개체 이름에 SampleImportScript.sql을 입력합니다.

    컴퓨터의 아무 위치에나 파일을 저장할 수 있습니다. 다음 절차에서 사용해야 하므로 이 위치를 기록해 둡니다.

  7. 저장을 클릭합니다.

  8. 파일 메뉴에서 솔루션 닫기를 클릭합니다.

    다음에는 데이터베이스 프로젝트를 만들고 앞에서 만든 스크립트에서 스키마를 가져옵니다.

스크립트에서 데이터베이스 스키마를 가져오려면

  1. 프로젝트 메뉴에서 데이터베이스 스크립트 가져오기를 클릭합니다.

  2. 시작 페이지를 읽은 후 다음을 클릭합니다.

  3. 찾아보기를 클릭하고 SampleImportScript.sql 파일을 저장한 위치로 이동합니다.

  4. SampleImportScript.sql 파일을 두 번 클릭하고 마침을 클릭합니다.

    스크립트를 가져온 다음 해당 스크립트에 정의된 개체가 데이터베이스 프로젝트에 추가됩니다.

  5. 요약을 검토하고 마침을 클릭합니다.

데이터베이스 프로젝트 구성, 빌드 및 배포

이 절차에서는 데이터베이스를 개발하고 테스트할 수 있도록 격리된 개발 환경(또는 샌드박스)에서 가져온 스키마를 포함하는 데이터베이스를 만듭니다.

데이터베이스 프로젝트를 구성하고 빌드하려면

  1. 솔루션 탐색기에서 CompareProject 프로젝트를 클릭합니다.

  2. 프로젝트 메뉴에서 CompareProject 속성을 클릭합니다.

    CompareProject 프로젝트에 대한 속성이 나타납니다.

  3. 배포 탭을 클릭합니다.

  4. 배포 작업 목록에서 배포 스크립트(.sql)를 만들고 데이터베이스에 배포를 클릭합니다.

  5. 대상 데이터베이스 설정에서 편집을 클릭합니다.

  6. 연결 속성 대화 상자에서 작업할 데이터베이스에 대한 연결 속성을 설정한 다음 확인을 클릭합니다.

    대상 연결 상자에 올바른 연결 문자열이 표시됩니다.

    경고

    테스트 서버, 개발 서버 또는 로컬 컴퓨터에서 데이터베이스를 만들어야 합니다. 프로덕션 서버는 사용하면 안 됩니다.

  7. 대상 데이터베이스 이름 상자에 CompareProjectDB를 입력합니다.

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

  9. 빌드 메뉴에서 솔루션 빌드를 클릭합니다.

    배포 스크립트는 방금 설정한 프로젝트 속성을 기반으로 빌드됩니다. 출력 창에 빌드 상태가 표시되고 빌드: 성공 또는 최신 상태 1이 마지막 줄에 표시됩니다.

데이터베이스 프로젝트를 배포하려면

  1. 솔루션 탐색기에서 CompareProject 프로젝트를 클릭합니다.

  2. 빌드 메뉴에서 CompareProject 배포를 클릭합니다.

    또는 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 배포를 클릭해도 됩니다.

    경고

    테스트 서버, 개발 서버 또는 로컬 컴퓨터에 대해 이 배포를 실행해야 합니다. 프로덕션 서버는 사용하면 안 됩니다.

    데이터베이스 프로젝트가 새 데이터베이스로 배포됩니다. 출력 창에 배포 상태가 표시되고 **배포되었습니다.**가 마지막 줄에 표시됩니다.

프로덕션 단계

데이터베이스 프로젝트에 테이블 추가

프로젝트에 테이블을 추가하려면

  1. 보기 메뉴에서 데이터베이스 스키마 뷰를 클릭합니다.

    스키마 뷰가 열리고 CompareProject 프로젝트의 스키마가 표시됩니다.

  2. 스키마 뷰에서 CompareProject 노드와 스키마 노드를 차례로 확장합니다.

  3. Sales를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 테이블을 클릭합니다.

    새 항목 추가 - CompareProject 대화 상자가 열립니다.

  4. 템플릿에서 테이블을 클릭합니다.

  5. 이름에 InternationalShippers를 입력한 다음 추가를 클릭합니다.

    InternationalShippers 테이블이 CompareProject 프로젝트에 추가됩니다. Transact-SQL 편집기에 테이블 정의가 나타납니다.

  6. InternationalShippers.table.sql의 SQL 스크립트를 다음 문으로 변경합니다.

    CREATE TABLE [Sales].[InternationalShippers]
    (
    [ShipperID] [int] NOT NULL IDENTITY(1,1),
    [CompanyName] [nvarchar] (40) NOT NULL,
    [Region] [nvarchar] (40) NOT NULL,
    [Phone] [nvarchar] (24) NULL
    ) ON [PRIMARY]
    
  7. InternationalShippers.table.sql 저장을 클릭합니다.

  8. 스키마 뷰에서 InternationalShippers 테이블을 마우스 오른쪽 단추로 클릭하고 솔루션 탐색기에서 파일 보기를 클릭합니다.

    솔루션 탐색기에서 InternationalShippers.sql 파일이 강조 표시됩니다.

  9. F4 키를 누릅니다.

    속성 창이 나타나고 InternationalShippers.table.sql 파일의 속성이 표시됩니다. Build Action 속성이 빌드로 설정되어 있으면 파일에 데이터베이스 개체에 대한 정의가 있으며 이 파일을 구문 분석하고 유효성을 검사해야 함을 의미합니다.

두 스키마 비교

두 스키마를 비교하려면

  1. 데이터 메뉴에서 스키마 비교를 가리킨 다음 새 스키마 비교를 클릭합니다.

  2. 새 스키마 비교 대화 상자가 열립니다.

  3. 대상 스키마에서 데이터베이스를 클릭하고 이 연습의 앞부분에서 배포한 데이터베이스에 대한 연결을 지정한 다음 확인을 클릭합니다.

    데이터베이스의 스키마가 변경된 프로젝트의 스키마와 비교되고 스키마 비교 창에 결과가 나타납니다. CompareProject 열에는 [Sales].[InternationalShippers] 테이블이 나타납니다. 테이블의 상태는 최신이고 해당 업데이트 작업은 만들기입니다. 지금 변경 내용을 전파하면 대상 데이터베이스에 테이블이 생성됩니다. 자세한 내용은 다음 절차를 참조하십시오.

예상 차이점을 검토하고 무시하려면

  1. 비교 결과 목록에서 SQL 파일 노드로 스크롤합니다.

    대상 데이터베이스의 경우 상태가 없음은 두 개의 행이 목록에 나타납니다. 하나는 파일 그룹 파일의 행이며 다른 하나는 로그 파일의 행입니다.

  2. 각 행의 업데이트 작업 열을 클릭하여 작업을 건너뛰기로 변경합니다.

    데이터베이스 스키마를 업데이트하는 경우 대개 대상 데이터베이스와 연결된 로그 파일이나 파일 그룹 파일은 변경하지 않습니다. 작업을 건너뛰기로 변경하면 대상 데이터베이스는 현재 파일을 계속 사용합니다.

    다음에는 필요에 따라 소스 데이터베이스와 일치하도록 대상 데이터베이스를 업데이트할 수 있습니다.

프로젝트에서 데이터베이스로 변경 내용 전파

변경 내용을 대상 데이터베이스로 전파하려면

  • 스키마 비교 창에서 업데이트 쓰기를 클릭합니다.

    참고

    프로젝트에 하나 이상의 오류가 있으면 업데이트 쓰기 단추를 사용할 수 없습니다. 이 경우 스키마 비교 상태 표시줄에 메시지가 나타납니다.

    InternationalShippers 테이블에 대한 만들기 작업을 포함하여 스키마 비교 창에 나열된 작업이 실행됩니다. 이 동기화를 통해 데이터베이스 프로젝트의 스키마와 일치하도록 데이터베이스의 스키마가 변경됩니다. 업데이트 작업이 완료되면 스키마가 다시 비교되고 결과가 새로 고쳐집니다.

    대상 스키마가 업데이트 중일 때 데이터 메뉴를 열고 스키마 비교를 가리킨 다음 대상에 쓰기 중지를 클릭하여 해당 작업을 취소할 수 있습니다.

    경고

    일부 스키마 변경 내용은 트랜잭션 범위 내에서 수행될 수 없으므로 업데이트 작업을 취소할 경우 데이터가 손실될 수 있습니다. 예를 들어 대상 데이터베이스의 테이블이 재작성을 위한 준비 과정에서 삭제될 수 있습니다. 이때 업데이트를 취소하면 테이블이 손실될 수 있습니다. 이러한 종류의 데이터 손실이 발생할 경우 스키마를 다시 비교해야 합니다.

참고 항목

작업

방법: 데이터베이스 스키마 비교

방법: 두 데이터베이스의 데이터 비교 및 동기화

개념

데이터베이스 스키마 비교 및 동기화

하나 이상의 테이블에 있는 데이터를 참조 데이터베이스에 있는 데이터와 비교하고 동기화