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

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

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

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

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

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

Подробные технические сведения о провизионировании отфильтрованных областей см. в разделе Как фильтровать данные для синхронизации базы данных (SQL Server).

Определение отфильтрованной области и сервера провизионирования

  1. В обозревателе решений щелкните правой кнопкой мыши Решение «SyncSQLServerAndSQLExpress», укажите Добавить и выберите Создать проект.

  2. Выберите Visual C# в Типы проектов и выберите Приложение командной строки в Шаблоны.

  3. Укажите ProvisionServerWithFilteredScope в качестве имени проекта.

  4. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Создать проект.

  5. В обозревателе решений щелкните правой кнопкой мыши ProvisionServerWithFilteredScope и выберите Добавить ссылку.

  6. Выберите Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer и нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить ссылку.

  7. Добавьте следующие инструкции using в начало файла Program.cs после существующих инструкций using.

    using System.Data;
    using System.Data.SqlClient;
    
    using Microsoft.Synchronization;
    using Microsoft.Synchronization.Data;
    using Microsoft.Synchronization.Data.SqlServer;
    
  8. Добавьте следующую инструкцию к методу Main, чтобы создать соединение SQL с серверной базой данных.

    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
    
    Важное примечаниеВажно!

    Если не используется экземпляр по умолчанию, в указанной выше инструкции замените имя сервера именем экземпляра используемого сервера. Например, если используемый экземпляр SQL Server имеет имя MYSQLINSTANCE, замените (local) на .\MYSQLINSTANCE.

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

    1. Создайте экземпляр класса DbSyncScopeDescription. Класс DbSyncScopeDescription используется для указания имени области синхронизации и списка таблиц для синхронизации. Таблицы задаются с помощью класса DbSyncTableDescription.

    2. Создайте экземпляр класса DbSyncTableDescription на основе схемы таблицы Orders, полученной из серверной базы данных SyncDB. Класс DbSyncTableDescription используется для указания имени таблицы, столбцов таблицы для синхронизации, типов данных таблицы и других сведений, необходимых для выполнения синхронизации. Эти сведения могут быть указаны явным образом или получены путем запроса базы данных с помощью метода GetDescriptionForTable(String, SqlConnection).

      В данном пошаговом руководстве будет использоваться метод GetDescriptionForTable(String, SqlConnection) класса SqlSyncDescriptionBuilder для получения описания таблицы.

    3. Добавьте объект DbSyncTableDescription к коллекции Tables объекта DbSyncScopeDescription с помощью метода Add.

    // define the OrdersScope-NC filtered scope 
    // this scope filters records in the Orders table with OriginState set to NC
    DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("OrdersScope-NC");
    
    // get the description of the Orders table and add it to the scope
    DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Orders", serverConn);
    scopeDesc.Tables.Add(tableDesc);
    
  10. Добавьте следующий код к методу Main для провизионирования серверной базы данных SyncDB с помощью артефактов, связанных с синхронизацией. Этот код создает объект SqlSyncScopeProvisioning, задает значение флага создания таблицы Skip, поскольку таблица уже существует на сервере, задает столбец OriginState в качестве столбца фильтра со значением NC и начинает процесс провизионирования.

    1. Создайте экземпляр класса SqlSyncScopeProvisioning на основе объекта DbSyncScopeDescription и соединения с серверной базой данных. Класс SqlSyncScopeProvisioning представляет провизионирование базы данных SQL Server для конкретной области, представленной объектом DbSyncScopeDescription.

    2. Вызовите метод SetCreateTableDefault(DbSyncCreationOption), указав значение DbSyncCreationOption как Skip, поскольку таблица Orders уже существует в серверной базе данных. Метод SetCreateTableDefault(DbSyncCreationOption) используется для указания того, следует ли создавать базовые таблицы при настройке областей.

    3. Укажите столбец OriginState таблицы Orders в качестве столбца фильтра и «**OriginState = "NC"**» в качестве фильтра предложения для таблицы. Метод AddFilterColumn(String) позволяет добавить столбец, который используется в предложении фильтра, указанном свойством FilterClause. К таблице отслеживания, которая используется для отслеживания изменений в базовой таблице, добавляется столбец фильтра. Выражением фильтрации является предложение WHERE без ключевого слова WHERE. Псевдонимом [side] является псевдоним для таблицы отслеживания. Выполняется вызов этих элементов объекта SqlSyncTableProvisioning, связанного с таблицей Orders.

    4. Вызовите метод Apply()()()() на объекте SqlSyncScopeProvisioning, чтобы начать процесс провизионирования, в ходе которого создается инфраструктура отслеживания изменений в серверной базе данных.

    // create server provisioning object
    SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);
    
    // no need to create the Orders table since it already exists, 
    // so use the Skip parameter
    serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);
    
    // set the filter column on the Orders table to OriginState
    serverProvision.Tables["Orders"].AddFilterColumn("OriginState");
    
    // set the filter value to NC
    serverProvision.Tables["Orders"].FilterClause = "[side].[OriginState] = 'NC'";
    
    // start the provisioning process
    serverProvision.Apply();
    
  11. В обозревателе решений щелкните правой кнопкой мыши ProvisionServerWithFilteredScope и выберите команду Построить.

  12. В обозревателе решений щелкните правой кнопкой мыши ProvisionServerWithFilteredScope и выберите команду Назначить запускаемым проектом.

  13. Нажмите клавиши Ctrl+F5, чтобы выполнить программу.

  14. Нажмите ВВОД, чтобы закрыть окно командной строки.

  15. В среде SQL Server Management Studio разверните узел SyncDB, разверните Таблицы, после чего должна отобразиться таблица Orders_Tracking, созданная при выполнении провизионирования. Также в процессе провизионирования создаются и другие объекты, такие как триггеры и хранимые процедуры.

  16. Чтобы выполнить следующую задачу пошагового руководства, не закрывайте Visual Studio.

Полный пример кода

using System;
using System.Data;
using System.Data.SqlClient;

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;

namespace ProvisionServerWithFilteredScope
{
    class Program
    {
        static void Main(string[] args)
        {
            // create a connection to the server database
            SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

            // define the OrdersScope-NC filtered scope 
            // this scope filters records in the Orders table with OriginState set to NC
            DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("OrdersScope-NC");

            // get the description of the Orders table and add it to the scope
            DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Orders", serverConn);
            scopeDesc.Tables.Add(tableDesc);

           // create server provisioning object
            SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);

            // no need to create the Orders table since it already exists, 
            // so use the Skip parameter
            serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);

            // set the filter column on the Orders table to OriginState
            serverProvision.Tables["Orders"].AddFilterColumn("OriginState");

            // set the filter value to NC
            serverProvision.Tables["Orders"].FilterClause = "[side].[OriginState] = 'NC'";

            // start the provisioning process
            serverProvision.Apply();
        }
    }
}

См. также

Другие ресурсы

Как фильтровать данные для синхронизации базы данных (SQL Server)