Поделиться через


Пошаговое руководство. Сравнение схем двух баз данных

Этот раздел применим к:

Visual Studio Ultimate

Visual Studio Premium

Visual Studio Professional 

Visual Studio Express

Тема применяется Тема применяется Тема не применяется Тема не применяется

В этом пошаговом руководстве выполняется сравнение схем двух баз данных с использованием Visual Studio. Действие сравнения схем генерирует также скрипт на языке описания данных (DDL) на основе отличий. Этот файл предназначен для синхронизации схемы целевого объекта со схемой исходного. Дополнительные сведения см. в разделе Сравнение и синхронизация схем баз данных.

В данном пошаговом руководстве выполняются следующие процедуры.

  • Создание простой базы данных. Если вы уже выполнили Пошаговое руководство. Сравнение схем базы данных и проекта базы данных, то можете использовать получившуюся базу данных и пропустить эту часть пошагового руководства.

  • Создание пустой базы данных. База данных CompareProjectDB служит источником, и создается пустая база данных, которая послужит целевой.

  • Сравнение схем двух баз данных. Сравнивая схемы, вы идентифицируете структурные различия баз данных, отображая эти различия в виде таблицы, и создаете выражающий их скрипт DDL.

  • Анализ скрипта синхронизации. Перед выполнением DDL-скрипта вы его проверяете и можете отредактировать.

  • Обновление целевой базы данных. Скрипт DDL выполняется для изменения схемы целевой базы данных.

Обязательные компоненты

У вас должны быть установлены следующие продукты.

  • SQL Server 2008

  • Разрешения на создание и обновление баз данных на целевом сервере базы данных.

  • Visual Studio Premium или Visual Studio Ultimate.

Создание простой базы данных

Чтобы создать простую базу данных, следует выполнить следующие задачи.

  • Создание скрипта, содержащего схему базы данных.

  • Создание проекта базы данных и импорт схемы.

  • Развертывание проекта базы данных в изолированной среде разработки.

Создание скрипта, содержащего схему базы данных

Создание скрипта, из которого можно импортировать схему

  1. В меню Файл выберите Создать и щелкните Файл.

    Появится диалоговое окно Создание файла.

  2. В списке Категории щелкните элемент Общие, если он еще не выделен.

  3. В списке Шаблоны выберите SQL-файл, а затем нажмите кнопку Открыть.

    Откроется редактор Transact-SQL.

  4. Скопируйте следующий код Transact-SQL и вставьте его в редактор 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. В области Установленные шаблоны разверните узел База данных и щелкните SQL Server.

  3. В списке шаблонов выберите Проект базы данных SQL Server 2008.

  4. В поле Имя введите CompareProjectDB.

  5. В списке Решение щелкните пункт Создать решение, если он еще не выделен.

  6. Установите флажок Создать каталог для решения, если он еще не установлен.

  7. Снимите флажок Добавить в систему управления версиями, если он установлен, и нажмите кнопку ОК.

    В окне Обозревателе решений отобразится созданный проект. Далее импортируйте схему базы данных из скрипта.

Импорт схемы базы данных из скрипта

  1. В меню Проект выберите команду Импортировать скрипт.

  2. Прочитав страницу приветствия, нажмите кнопку Далее.

  3. Нажмите кнопку Обзор и укажите путь к сохраненному файлу SampleImportScript.sql.

  4. Дважды щелкните файл SampleImportScript.sql и нажмите кнопку Готово.

    Скрипт будет импортирован, объекты, определенные в этом скрипте, — добавлены в проект базы данных.

  5. Просмотрите сводные данные и нажмите кнопку Готово, чтобы завершить операцию.

    Примечание

    Процедура Sales.uspFillOrder содержит намеренную ошибку кода, которую вы найдете и исправите в пошаговом руководстве по модульному тестированию.

Анализ результирующего проекта

  1. В окне Обозреватель решений разверните дочерний узел Объекты схемы.

  2. Исследуйте дочерние узлы, расположенные ниже узла Объекты схемы в иерархии.

    Обозреватель решений содержит файлы, которые определяют объекты базы данных.

  3. В меню Вид выберите команду Представление схемы базы данных.

  4. В Представлении схемы разверните узел CompareProjectDB.

  5. Исследуйте дочерние узлы, расположенные ниже узла CompareProjectDB в иерархии.

    В Представлении схемы содержатся все объекты, определенные в файлах, отображаемых в обозревателе решений.

Развертывание в изолированной среде разработки

Затем вы развернете проект для создания базы данных, содержащей импортированную схему, но без данных. База данных создается в изолированной среде разработки, или песочнице. Таким образом можно разработать и протестировать базу данных независимо от других действий.

Настройка и построение проекта базы данных

  1. В окне Обозреватель решений щелкните проект базы данных CompareProjectDB.

  2. В меню Проект выберите команду Свойства CompareProjectDB.

    Появится диалоговое окно свойств проекта.

  3. Перейдите на вкладку Развертывание.

  4. В списке Настроить параметры развертывания для выберите пункт Моя изолированная среда разработки. При настройке параметров изолированной среды разработки можно использовать параметры развертывания, отличающиеся от тех, которые будут использоваться в ваших средах, например на тестовом или рабочем сервере.

  5. В списке Действие развертывания щелкните Создать скрипт развертывания (SQL) и развернуть в базе данных.

  6. В группе Параметры целевой базы данных нажмите кнопку Изменить.

    Появится диалоговое окно Свойства подключения.

  7. Задайте свойства подключения для базы данных, которую вы хотите создать, и нажмите кнопку ОК.

    В поле Целевое подключение отображается необходимая строка подключения.

    Предупреждение

    Вам необходимо создать базу данных на тестовом сервере, сервере разработки или на локальном компьютере.Рабочий сервер указывать не следует.

  8. В поле Имя целевой базы данных введите CompareProjectDB.

  9. Нажмите кнопку Правка возле пункта Файл конфигурации развертывания.

  10. Снимите флажок Блокировать добавочное развертывание при возможности потери данных.

    Примечание

    В рамках данного пошагового руководства вы будете тестировать хранимые процедуры в пустой базе данных, которая развертывается в рамках модульного теста базы данных.Не нужно сохранять существующие данные, так как хранимые процедуры будут тестироваться в изолированной среде разработки.

  11. В меню Файл выберите команду Сохранить все.

  12. В меню Построение выберите Построить решение.

    Будет построен скрипт развертывания на основе только что заданных вами свойств. Состояние построения отображается в окне Выходные данные, а в последней строке должно быть выведено сообщение Построение: успешно и без изменений: 1.

Развертывание проекта базы данных

  1. В окне Обозреватель решений щелкните проект базы данных CompareProjectDB.

  2. В меню Построение выберите команду Развернуть CompareProjectDB.

    Предупреждение

    Вам необходимо снова выполнить это развертывание на тестовом сервере, сервере разработки или на локальном компьютере.Рабочий сервер указывать не следует.

    Проект базы данных развертывается в новой базе данных. Состояние развертывания отображается в окне Выходные данные, а в последней строке должно отобразиться сообщение Развертывание завершено успешно. Затем необходимо создать пустую базу данных, которую можно сравнить с развернутой базой данных.

Создание пустой базы данных

Создание пустой базы данных

  1. В меню Файл последовательно выберите пункты Создать и Проект.

    Отобразится диалоговое окно Новый проект.

  2. В списке Установленные шаблоны разверните узел База данных и выберите SQL Server.

  3. Щелкните Мастер SQL Server 2008.

  4. В поле Имя введите EmptyDB.

  5. Примите значения по умолчанию для остальных полей и нажмите кнопку ОК.

  6. В мастере создания проекта базы данных щелкните Настроить построение и развернуть.

  7. В списке Действие развертывания щелкните Создать скрипт развертывания (SQL) и развернуть в базе данных.

  8. В области Конечное подключение нажмите кнопку Обзор.

  9. Задайте подключение к серверу баз данных, на котором требуется создать пустую базу данных, и нажмите кнопку Готово.

    Проект базы данных с именем EmptyDB будет создан и появится в окне Обозреватель решений.

  10. В окне Обозреватель решений щелкните проект базы данных EmptyDB.

  11. В меню Построение выберите команду Развернуть EmptyDB.

    Проект базы данных будет построен и развернут на заданном сервере.

Сравнение схем двух баз данных

Сравнение схем двух баз данных

  1. В меню Данные выберите Сравнение схемы и щелкните Новое сравнение схем.

    Появится диалоговое окно Новое сравнение схем, где можно задать источник и целевой объект. В этом диалоговом окне идентифицируются серверы, на которых находятся исходная и целевая базы данных, имя базы данных и тип проверки подлинности, используемые для подключения к каждой базе данных.

    Также в фоновом режиме открывается окно "Сравнение схем" и Visual Studio автоматически присваивает ему имя, такое как SchemaCompare1.

  2. В разделе Исходная схема щелкните База данных и затем щелкните подключение, соответствующее базе данных CompareProjectDB.

    Если требуемое подключение не появится в списке, щелкните Создать подключение. В диалоговом окне Свойства подключения определите сервер, на котором находится база данных CompareProjectDB, тип проверки подлинности при подключении к серверу и саму базу данных. По завершении нажмите кнопку ОК.

    Примечание

    После установки подключения оно отобразится в обозревателе сервера в Подключения данных.

  3. В разделе Целевая схема щелкните База данных и затем щелкните подключение, соответствующее базе данных EmptyDB.

    Если требуемое подключение не появится в списке, щелкните Создать подключение. В диалоговом окне Свойства подключения укажите сервер, на котором находится база данных EmptyDB, тип проверки подлинности при подключении к серверу и саму базу данных. По завершении нажмите кнопку ОК.

  4. Щелкните Параметры, чтобы задать объекты сравнения, какие типы различий будут игнорироваться и что будет содержать созданный скрипт обновления.

    Примечание

    При сравнении баз данных не нужно задавать переменные SQLCMD.

  5. На вкладке Общие раскройте узел Параметры сравнения.

  6. Выберите Игнорировать имена файлов, а также пути к файлам и файлам журналов.

  7. Нажмите кнопку ОК.

  8. Нажмите кнопку ОК.

    Начнется сравнение схем.

    Примечание

    Можно остановить выполняемое сравнение, открыв меню Данные, выбрав команду Сравнение схем и щелкнув Остановить сравнение схем.

    Можно настроить параметры, определяющие, что считается различием и как создается скрипт обновления. Дополнительные сведения см. в разделе Практическое руководство. Установка параметров сравнения схем базы данных.

    Когда сравнение завершается, структурные различия двух баз данных отображаются в таблице в окне «Сравнение схемы». В этой таблице отображается по одной строке для каждого объекта базы данных, имеющегося в любой из двух баз данных. Объекты базы данных упорядочены по типам: таблицы, представления, хранимые процедуры, роли и т. д.

Обновление целевой базы данных

Существуют два способа обновления схемы целевой базы данных. Можно обновить схему непосредственно из окна "Сравнение схем" или с помощью редактора Transact-SQL. В этом разделе описываются оба варианта.

Когда сравнение завершается, структурные различия двух баз данных отображаются в таблице в окне «Сравнение схемы». Для каждого объекта в столбце CompareProjectDB (исходная база данных) в таблице в столбце Действие обновления отображается действие, необходимое для синхронизации этого объекта в двух базах данных. В этом случае, поскольку целевая база данных пуста за исключением объектов по умолчанию, столбец Состояние содержит преимущественно индикаторы состояния «Новый», а столбец Действие обновления — преимущественно «Создать».

Запись обновлений в целевую базу данных

Можно обновить схему целевой базы данных с использованием действий обновления, перечисленных в окне "Сравнение схем". Для этого необходимо выполнить шаги раздела Запись обновлений в целевую базу данных.

Просмотр скрипта и запись обновлений в целевую базу данных

Можно экспортировать скрипт обновления, проанализировать его, возможно, изменить и затем с его помощью синхронизировать целевую базу данных. Чтобы выполнить эти задачи, следуйте пошаговой процедуре в разделе Анализ и выполнение скрипта синхронизации.

Запись обновлений в целевую базу данных

Примечание

Перед записью обновлений на рабочий сервер или сервер разработки подумайте о создании резервной копии целевой базы данных.Поскольку некоторые изменения схемы не могут выполнены в одной транзакции, при отмене начатой операции обновления можно потерять данные.Например, таблица целевой базы данных может быть удалена при подготовке к ее повторному созданию.Если в этот момент отменить обновление, эта таблица будет потеряна.В этом пошаговом руководстве обновляется пустая база данных разработки.Поэтому резервное копирование целевой базы данных не выполняется.

Запись обновлений в целевую базу данных

  1. Прокрутите список результатов сравнения до узла Файлы SQL.

  2. Для файла CompareProjectDB и файла CompareProjectDB_Log замените действие обновления с "Создать" на "Пропустить".

    Примечание

    При сравнении двух баз данных, расположенных на одном сервере баз данных синхронизация завершится с ошибкой, потому что целевые данные и файлы журнала уже существуют и используются исходной базой данных.В этом пошаговом руководстве пропускается обновление файлов и синхронизируется содержимое базы данных.

  3. Для файла EmptyDB и файла EmptyDB_log замените действие обновления с "Отбросить" на "Пропустить".

    Примечание

    Так как вы не создаете файлы из исходной базы данных, не требуется удалять файлы для целевой базы данных.В этом пошаговом руководстве пропускается обновление файлов и синхронизируется содержимое базы данных.

  4. На панели инструментов Сравнение схемы щелкните Записать обновления.

    Будут выполнены действия обновления, перечисленные в окне «Сравнение схемы». При синхронизации схема целевой базы данных изменяется в соответствии со схемой исходной базы данных.

    Примечание

    Пока операция обновления не завершилась, ее можно отменить, открыв меню Данные, выбрав команду Сравнение схемы и щелкнув Остановить запись в целевой объект.

    Если требуется снова выполнить сравнение для проверки применения выбранных обновлений, можно нажать кнопку Обновить на панели инструментов Сравнение схем.

Анализ и выполнение скрипта синхронизации

Анализ скрипта синхронизации

  1. В меню Данные выберите команду Сравнение схемы, затем Экспорт в и щелкните Редактор.

    Можно также щелкнуть Экспортировать в редактор на панели инструментов Сравнение схем.

    Откроется редактор Transact-SQL в отключенном режиме, и в нем отобразится скрипт синхронизации Transact-SQL. Имя данного окна имеет следующую структуру: Server.CompareProjectDB - SchemaUpdate_EmptyDB_1.sql. и отображает скрипт Transact-SQL. Поскольку в этом окне предоставляется доступ для чтения и записи, данный скрипт можно изменять. Если вы его изменили, откройте меню Файл и выберите команду Сохранить. При сохранении файла можно задать для него путь и имя.

  2. На панели инструментов редактора Transact-SQL щелкните Режим SQLCMD.

    Если не включить режим SQLCMD, возникнут ошибки при попытке выполнить скрипт.

  3. Для синхронизации схем двух баз данных выполните скрипт, щелкнув Выполнить код SQL на панели инструментов редактора Transact-SQL или нажав клавишу F5.

    Откроется диалоговое окно Подключение к базе данных.

  4. Щелкните подключение, соответствующее базе данных EmptyDB и нажмите кнопку ОК.

    Предупреждение

    Если попытаться выполнить скрипт обновления для другой базы данных, можно получить не тот результат, который вам нужен.

    Сравнение не обновляется автоматически. Если требуется снова выполнить сравнение для проверки применения выбранных обновлений, нажмите кнопку Обновить на панели инструментов Сравнение схем.

Следующие действия

Теперь можно сравнить данные в двух базах данных. Дополнительные сведения см. в разделе Практическое руководство. Сравнение и синхронизация двух баз данных.

См. также

Задачи

Практическое руководство. Сравнение и синхронизация двух баз данных

Практическое руководство. Сравнение схем баз данных

Пошаговое руководство. Сравнение данных двух баз данных

Пошаговое руководство. Сравнение схем базы данных и проекта базы данных

Основные понятия

Сравнение и синхронизация данных одной или нескольких таблиц с данными в справочной базе данных

Создание баз данных и приложений уровня данных, а также управление ими в Visual Studio