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


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

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

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, затем раскройте узел Schemas.

  3. Щелкните правой кнопкой мыши Продажи, выберите команду Добавить и щелкните Таблица.

    Откроется диалоговое окно Добавление нового элемента - CompareProject.

  4. В Шаблоны щелкните Таблица.

  5. В поле Имя введите InternationalShippers и нажмите кнопку Добавить.

    Таблица с именем InternationalShippers будет добавлена в проект CompareProject. Определение таблицы появится в редакторе Transact-SQL.

  6. Замените скрипт SQL в InternationalShippers.table.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 появится таблица [Продажи].[InternationalShippers]. Состояние таблицы указано как "Новая", а ее действие обновления — "Создание". Если сейчас распространить изменения, таблица будет создана в целевой базе данных. Дополнительные сведения см. в следующей процедуре.

Анализ и пропуск ожидаемых различий

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

    Для целевой базы данных в списке есть две строки со статусом Отсутствует — одна строка для файла файловой группы и одна для файла журнала.

  2. Щелкните каждую строку в столбце Действие обновления, чтобы изменить значение на Пропустить.

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

    Затем можно обновить целевую базу данных для соответствия исходной.

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

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

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

    Примечание

    Кнопка Записать обновления может быть недоступна, если проект содержит одну или более ошибок.Если такое происходит, появляется сообщение в строке состояния сравнения схем.

    Действия, перечисленные в окне Сравнение схем, включая действие "Создание" для таблицы InternationalShippers, выполняются. В результате будут синхронизированы изменения схемы базы данных в соответствии с проектом базы данных. После завершения операции обновления схемы сравниваются снова, результаты обновляются.

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

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

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

См. также

Задачи

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

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

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

Сравнение и синхронизация схем баз данных

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