Как провизионировать и отменять провизионирование областей синхронизации и шаблонов (SQL Server)

В этом разделе показано, как удалять области синхронизации и шаблоны из базы данных SQL Server, SQL Azure или SQL Server Compact. В примерах в этом разделе особое внимание уделено следующим классам Sync Framework.

SqlSyncScopeProvisioning

SqlCeSyncScopeProvisioning

SqlSyncScopeDeprovisioning

SqlCeSyncScopeDeprovisioning

Дополнительные сведения о запуске образца кода см. в подразделе «Образцы приложений в разделах инструкций» раздела Синхронизация SQL Server и SQL Server Compact.

Основные сведения о провизионировании и отмене провизионирования

Первый этап настройки базы данных для синхронизации — это задание области, определяющей объекты, которые должны быть синхронизированы. После того как область синхронизации определена, необходимо подготовить базу данных, создав инфраструктуру отслеживания изменений и управления метаданными, которая состоит из таблиц метаданных, триггеров и хранимых процедур. Эта инфраструктура необходима службам Sync Framework для синхронизации области. После завершения провизионирования базы данных ее можно синхронизировать с другими элементами сообщества синхронизации с помощью такого поставщика, как SqlSyncProvider для представления базы данных и объекта SyncOrchestrator для управления сеансом синхронизации и соединения с другой службой синхронизации. Провизионирование базы данных к синхронизации выполняется отдельно от синхронизации с другими базами данных, а код для провизионирования базы данных обычно содержится в отдельном приложении (не в приложении, которое используется для синхронизации).

Объекты провизионирования, которые используются для провизионирования базы данных SQL Server или SQL Azure, можно настроить для создания отдельных или всех элементов, перечисленных ниже, в базе данных после ее провизионирования. По умолчанию для создания элементов синхронизации задается параметр CreateOrUseExisting, что указывает на возможность создания элемента только при его отсутствии в базе данных:

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

  • Для каждой базовой таблицы в области существует одна таблица отслеживания. Таблица отслеживания используется для отслеживания изменений в связанной базовой таблице. Создание таблицы отслеживания управляется методом SetCreateTrackingTableDefault. Если таблица уже является частью другой области и новая область добавляет столбец фильтра, который не содержался в исходной области, Sync Framework автоматически добавляет столбец фильтра к таблице отслеживания и заполняет ее правильными значениями.

  • Триггеры, обновляющие таблицу отслеживания при внесении изменений напрямую в базовую таблицу. Создание триггера управляется методом SetCreateTriggersDefault.

  • Хранимые процедуры для задач синхронизации, таких как перечисление изменений, вставка изменений, обновление данных и удаление данных. Создание хранимых процедур управляется методом SetCreateProceduresDefault. Если таблица уже является частью другой области, а новая область добавляет столбец фильтра, которого не было в исходной области, следует вызвать метод SetCreateProceduresForAdditionalScopeDefault и указать параметр Create, чтобы создать дополнительную процедуру перечисления, в список параметров которой входит столбец фильтра. Процедуры массового применения, которые используют возвращающие табличные значения параметры для одновременного выполнения действий вставки, обновления и удаления для нескольких строк, также создаются для баз данных SQL Server 2008 и SQL Azure. Создание процедур массового применения управляется методом SetUseBulkProceduresDefault. При этом следует учитывать, что после создания процедур массового применения для таблицы они всегда будут использоваться для всех областей, содержащих эту таблицу, даже для тех, для которых процедура массового применения использоваться не должна. Кроме того, следует помнить, что если таблица уже была провизионирована для другой области, использующей процедуры массового применения, то указание значения false для SetUseBulkProceduresDefault не вызовет никакого эффекта.

  • Записи добавляются к специальным таблицам, таким как таблица scope_info, в которых содержатся сведения об областях, содержащихся в базе данных. Если эти таблицы не существуют, они создаются.

Сбор элементов синхронизации может выполняться в отдельную схему в базе данных. Для этого укажите имя схемы в свойстве SqlSyncScopeProvisioning..::..ObjectSchema. Эта схема уже должна существовать в базе данных. Если при подготовке базы данных используется схема, то при каждом использовании области необходимо указывать эту же схему. Например, при синхронизации базы данных необходимо указать свойство SqlSyncProvider..::..ObjectSchema.

Элементы синхронизации можно снабдить префиксом в виде строки. Для этого укажите префикс в методе SqlSyncScopeProvisioning..::..ObjectPrefix или SqlCeSyncScopeProvisioning..::..ObjectPrefix. Если при подготовке базы данных используется префикс, то при каждом использовании области необходимо указывать этот же префикс. Например, при синхронизации базы данных необходимо указать свойство SqlSyncProvider..::..ObjectPrefix.

Провизионирование можно выполнить напрямую путем вызова метода SqlSyncScopeProvisioning..::..Apply или SqlCeSyncScopeProvisioning..::..Apply. Также для базы данных SQL Server можно создать и выполнить скрипт. Чтобы создать скрипт, вызовите метод SqlSyncScopeProvisioning..::..Script.

Если область больше не нужна, можно удалить ее вместе со всеми связанными таблицами метаданных, триггерами и хранимыми процедурами, вызвав метод SqlSyncScopeDeprovisioning..::..DeprovisionScope или SqlCeSyncScopeDeprovisioning..::..DeprovisionScope. После удаления области она больше не может быть использована для синхронизации. Если какой-либо элемент базы данных (например, таблица метаданных) используется более чем в одной области, он не будет удален до тех пор, пока не будет удалена последняя связанная с ним область. Например, имеется таблица Customers. Определены две области с именами RetailCustomers и WholesaleCustomers, которые содержат таблицу Customers. При удалении области WholesaleCustomers таблица метаданных для таблицы Customers не будет удалена, поскольку она по-прежнему используется областью RetailCustomers.

Если для фильтрации данных в базе данных SQL Server или SQL Azure используется фильтр на основе параметров, то нужно сначала создать шаблон фильтра, а затем создать на его основе отфильтрованные области. Также шаблон фильтра вместе со всеми созданными по нему отфильтрованными областями, связанными таблицами метаданных, триггерами и хранимыми процедурами можно легко удалить, вызвав метод DeprovisionTemplate. Например, можно создать шаблон customerstate_template, который выполняет фильтрацию по параметру state. Создаются две отфильтрованные области, customers_WA и customers_OR, которые основаны на шаблоне customerstate_template. При удалении customerstate_template области customers_WA и customers_OR также удаляются. Дополнительные сведения о фильтрах на основе параметров см. в разделе Как фильтровать данные для синхронизации базы данных (SQL Server).

Можно также удалить из базы данных все области и фильтры вместе со всеми таблицами метаданных, триггерами и хранимыми процедурами синхронизации, вызвав метод SqlSyncScopeDeprovisioning..::..DeprovisionStore или SqlCeSyncScopeDeprovisioning..::..DeprovisionStore. Также, поскольку при удалении отдельных областей и шаблонов фильтров удаляются только метаданные уровня области и шаблона, но не удаляются метаданные уровня базы данных, можно использовать метод SqlSyncScopeDeprovisioning..::..DeprovisionStore или SqlCeSyncScopeDeprovisioning..::..DeprovisionStore для очистки таблиц метаданных синхронизации, оставшихся после удаления всех областей и шаблонов.

Примечание

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

Провизионирование баз данных

В следующем примере производится провизионирование серверной базы данных SQL Server с шаблоном фильтра customertype_template и создание двух отфильтрованных областей — RetailCustomers и WholesaleCustomers. Клиентская база данных SQL Server провизионируется с областью RetailCustomers, а клиентская база данных SQL Server Compact — с областью WholesaleCustomers.

// Create a filtered scope template named "customertype_template", and add one table to the scope.
DbSyncScopeDescription customerTypeScope = new DbSyncScopeDescription("customertype_template");

DbSyncTableDescription customerDescription =
    SqlSyncDescriptionBuilder.GetDescriptionForTable("Sales.Customer", serverConn);
customerTypeScope.Tables.Add(customerDescription);

SqlSyncScopeProvisioning customerTypeTemplate = new SqlSyncScopeProvisioning(serverConn, customerTypeScope, SqlSyncScopeProvisioningType.Template);
customerTypeTemplate.Tables["Sales.Customer"].AddFilterColumn("CustomerType");
customerTypeTemplate.Tables["Sales.Customer"].FilterClause = "[side].[CustomerType] = @customertype";
SqlParameter param = new SqlParameter("@customertype", SqlDbType.NVarChar, 100);
customerTypeTemplate.Tables["Sales.Customer"].FilterParameters.Add(param);
customerTypeTemplate.Apply();

// Create a synchronization scope on the server for retail customers.
SqlSyncScopeProvisioning serverProvRetail = new SqlSyncScopeProvisioning(serverConn);
serverProvRetail.PopulateFromTemplate("RetailCustomers", "customertype_template");
serverProvRetail.Tables["Sales.Customer"].FilterParameters["@customertype"].Value = "Retail";
serverProvRetail.Apply();

// Create another scope in the server database for wholesale customers.
SqlSyncScopeProvisioning serverProvWholesale = new SqlSyncScopeProvisioning(serverConn);
serverProvWholesale.PopulateFromTemplate("WholesaleCustomers", "customertype_template");
serverProvWholesale.Tables["Sales.Customer"].FilterParameters["@customertype"].Value = "Wholesale";
serverProvWholesale.Apply();

// Provision the Sql Server client database SyncSamplesDb_SqlPeer2 with the retail customer scope.
DbSyncScopeDescription clientSqlDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope("RetailCustomers", serverConn);
SqlSyncScopeProvisioning clientSqlConfig = new SqlSyncScopeProvisioning(clientSqlConn, clientSqlDesc);
clientSqlConfig.Apply();

// Create a SQL Server Compact database and provision it with the wholesale customer scope.
Utility.DeleteAndRecreateCompactDatabase(Utility.ConnStr_SqlCeSync1, true);
DbSyncScopeDescription clientSqlCe1Desc = SqlSyncDescriptionBuilder.GetDescriptionForScope("WholesaleCustomers", serverConn);
SqlCeSyncScopeProvisioning clientSqlCe1Config = new SqlCeSyncScopeProvisioning(clientSqlCe1Conn, clientSqlCe1Desc);
clientSqlCe1Config.Apply();
' Create a filtered scope template named "customertype_template", and add one table to the scope.
Dim customerTypeScope As New DbSyncScopeDescription("customertype_template")

Dim customerDescription As DbSyncTableDescription = SqlSyncDescriptionBuilder.GetDescriptionForTable("Sales.Customer", serverConn)
customerTypeScope.Tables.Add(customerDescription)

Dim customerTypeTemplate As New SqlSyncScopeProvisioning(serverConn, customerTypeScope, SqlSyncScopeProvisioningType.Template)
customerTypeTemplate.Tables("Sales.Customer").AddFilterColumn("CustomerType")
customerTypeTemplate.Tables("Sales.Customer").FilterClause = "[side].[CustomerType] = @customertype"
Dim param As New SqlParameter("@customertype", SqlDbType.NVarChar, 100)
customerTypeTemplate.Tables("Sales.Customer").FilterParameters.Add(param)
customerTypeTemplate.Apply()

' Create a synchronization scope on the server for retail customers.
Dim serverProvRetail As New SqlSyncScopeProvisioning(serverConn)
serverProvRetail.PopulateFromTemplate("RetailCustomers", "customertype_template")
serverProvRetail.Tables("Sales.Customer").FilterParameters("@customertype").Value = "Retail"
serverProvRetail.Apply()

' Create another scope in the server database for wholesale customers.
Dim serverProvWholesale As New SqlSyncScopeProvisioning(serverConn)
serverProvWholesale.PopulateFromTemplate("WholesaleCustomers", "customertype_template")
serverProvWholesale.Tables("Sales.Customer").FilterParameters("@customertype").Value = "Wholesale"
serverProvWholesale.Apply()

' Provision the Sql Server client database SyncSamplesDb_SqlPeer2 with the retail customer scope.
Dim clientSqlDesc As DbSyncScopeDescription = SqlSyncDescriptionBuilder.GetDescriptionForScope("RetailCustomers", serverConn)
Dim clientSqlConfig As New SqlSyncScopeProvisioning(clientSqlConn, clientSqlDesc)
clientSqlConfig.Apply()

' Create a SQL Server Compact database and provision it with the wholesale customer scope.
Utility.DeleteAndRecreateCompactDatabase(Utility.ConnStr_SqlCeSync1, True)
Dim clientSqlCe1Desc As DbSyncScopeDescription = SqlSyncDescriptionBuilder.GetDescriptionForScope("WholesaleCustomers", serverConn)
Dim clientSqlCe1Config As New SqlCeSyncScopeProvisioning(clientSqlCe1Conn, clientSqlCe1Desc)
clientSqlCe1Config.Apply()

Отмена подготовки базы данных

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

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

  2. Отмена провизионирования шаблона отфильтрованной области и всех связанных областей серверной базы данных.

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

Удаление области

Следующий пример иллюстрирует удаление области RetailCustomers из клиентской базы данных SQL Server. Рассмотрим другой пример: скрипт, который используется для удаления области, также сохраняется в файле. Этот скрипт может быть выполнен и для других баз данных, чтобы удалить область RetailCustomers. Этот шаг не является обязательным для отмены провизионирования области.

// Remove the retail customer scope from the Sql Server client database.
SqlSyncScopeDeprovisioning clientSqlDepro = new SqlSyncScopeDeprovisioning(clientSqlConn);

// First save the deprovisioning script so it can be run on other SQL Server client databases.
// This step is optional.
File.WriteAllText("SampleDeprovisionScript.txt",
    clientSqlDepro.ScriptDeprovisionScope("RetailCustomers"));

// Remove the scope.
clientSqlDepro.DeprovisionScope("RetailCustomers");
' Remove the retail customer scope from the Sql Server client database.
Dim clientSqlDepro As New SqlSyncScopeDeprovisioning(clientSqlConn)

' Save the deprovisioning script so it can be run on other SQL Server client databases.
' This step is optional.
File.WriteAllText("SampleDeprovisionScript.txt", clientSqlDepro.ScriptDeprovisionScope("RetailCustomers"))

' Remove the scope.
clientSqlDepro.DeprovisionScope("RetailCustomers")

Удаление шаблона фильтра

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

    -- Find all filtered scopes that were created from the filtered scope template named 'customertype_template'.
    
    select sync_scope_name from scope_info 
          where scope_config_id = 
          (select template_config_id from scope_templates 
                where template_name = N'customertype_template')

В следующем примере показано удаление шаблона customertype_template с серверной базы данных SQL Server. При удалении шаблона из этой базы данных также удаляются области RetailCustomers и WholesaleCustomers.

// Remove the "customertype_template" template from the server database. This also removes all of the
// scopes that depend on the template.
SqlSyncScopeDeprovisioning serverSqlDepro = new SqlSyncScopeDeprovisioning(serverConn);
serverSqlDepro.DeprovisionTemplate("customertype_template");
' Remove the "customertype_template" template from the server database. This also removes all of the
' scopes that depend on the template.
Dim serverSqlDepro As New SqlSyncScopeDeprovisioning(serverConn)
serverSqlDepro.DeprovisionTemplate("customertype_template")

Удаление всех объектов синхронизации

В следующем примере показано удаление таблиц метаданных, триггеров и хранимых процедур синхронизации из клиентской базы данных SQL Server Compact.

// Remove all scopes from the SQL Server Compact database.
SqlCeSyncScopeDeprovisioning clientSqlCeDepro = new SqlCeSyncScopeDeprovisioning(clientSqlCe1Conn);
clientSqlCeDepro.DeprovisionStore();
' Remove all scopes from the SQL Server Compact database.
Dim clientSqlCeDepro As New SqlCeSyncScopeDeprovisioning(clientSqlCe1Conn)
clientSqlCeDepro.DeprovisionStore()

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

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

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlServerCe;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using Microsoft.Synchronization.Data.SqlServerCe;

namespace Microsoft.Samples.Synchronization
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create the connections over which provisioning and synchronization
            // are performed. The Utility class handles all functionality that is not
            // directly related to synchronization, such as holding connection 
            // string information and making changes to the server database.
            SqlConnection serverConn = new SqlConnection(Utility.ConnStr_SqlSync_Server);
            SqlConnection clientSqlConn = new SqlConnection(Utility.ConnStr_SqlSync_Client);
            SqlCeConnection clientSqlCe1Conn = new SqlCeConnection(Utility.ConnStr_SqlCeSync1);

            // Create a filtered scope template named "customertype_template", and add one table to the scope.
            DbSyncScopeDescription customerTypeScope = new DbSyncScopeDescription("customertype_template");

            DbSyncTableDescription customerDescription =
                SqlSyncDescriptionBuilder.GetDescriptionForTable("Sales.Customer", serverConn);
            customerTypeScope.Tables.Add(customerDescription);

            SqlSyncScopeProvisioning customerTypeTemplate = new SqlSyncScopeProvisioning(serverConn, customerTypeScope, SqlSyncScopeProvisioningType.Template);
            customerTypeTemplate.Tables["Sales.Customer"].AddFilterColumn("CustomerType");
            customerTypeTemplate.Tables["Sales.Customer"].FilterClause = "[side].[CustomerType] = @customertype";
            SqlParameter param = new SqlParameter("@customertype", SqlDbType.NVarChar, 100);
            customerTypeTemplate.Tables["Sales.Customer"].FilterParameters.Add(param);
            customerTypeTemplate.Apply();

            // Create a synchronization scope on the server for retail customers.
            SqlSyncScopeProvisioning serverProvRetail = new SqlSyncScopeProvisioning(serverConn);
            serverProvRetail.PopulateFromTemplate("RetailCustomers", "customertype_template");
            serverProvRetail.Tables["Sales.Customer"].FilterParameters["@customertype"].Value = "Retail";
            serverProvRetail.Apply();

            // Create another scope in the server database for wholesale customers.
            SqlSyncScopeProvisioning serverProvWholesale = new SqlSyncScopeProvisioning(serverConn);
            serverProvWholesale.PopulateFromTemplate("WholesaleCustomers", "customertype_template");
            serverProvWholesale.Tables["Sales.Customer"].FilterParameters["@customertype"].Value = "Wholesale";
            serverProvWholesale.Apply();

            // Provision the Sql Server client database SyncSamplesDb_SqlPeer2 with the retail customer scope.
            DbSyncScopeDescription clientSqlDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope("RetailCustomers", serverConn);
            SqlSyncScopeProvisioning clientSqlConfig = new SqlSyncScopeProvisioning(clientSqlConn, clientSqlDesc);
            clientSqlConfig.Apply();

            // Create a SQL Server Compact database and provision it with the wholesale customer scope.
            Utility.DeleteAndRecreateCompactDatabase(Utility.ConnStr_SqlCeSync1, true);
            DbSyncScopeDescription clientSqlCe1Desc = SqlSyncDescriptionBuilder.GetDescriptionForScope("WholesaleCustomers", serverConn);
            SqlCeSyncScopeProvisioning clientSqlCe1Config = new SqlCeSyncScopeProvisioning(clientSqlCe1Conn, clientSqlCe1Desc);
            clientSqlCe1Config.Apply();

            // Remove the retail customer scope from the Sql Server client database.
            SqlSyncScopeDeprovisioning clientSqlDepro = new SqlSyncScopeDeprovisioning(clientSqlConn);

            // First save the deprovisioning script so it can be run on other SQL Server client databases.
            // This step is optional.
            File.WriteAllText("SampleDeprovisionScript.txt",
                clientSqlDepro.ScriptDeprovisionScope("RetailCustomers"));

            // Remove the scope.
            clientSqlDepro.DeprovisionScope("RetailCustomers");

            // Remove all scopes from the SQL Server Compact database.
            SqlCeSyncScopeDeprovisioning clientSqlCeDepro = new SqlCeSyncScopeDeprovisioning(clientSqlCe1Conn);
            clientSqlCeDepro.DeprovisionStore();

            // Remove the "customertype_template" template from the server database. This also removes all of the
            // scopes that depend on the template.
            SqlSyncScopeDeprovisioning serverSqlDepro = new SqlSyncScopeDeprovisioning(serverConn);
            serverSqlDepro.DeprovisionTemplate("customertype_template");

            serverConn.Close();
            serverConn.Dispose();
            clientSqlConn.Close();
            clientSqlConn.Dispose();
            clientSqlCe1Conn.Close();
            clientSqlCe1Conn.Dispose();

            Utility.CleanUpSqlNode(Utility.ConnStr_SqlSync_Server);
            Utility.CleanUpSqlNode(Utility.ConnStr_SqlSync_Client);

            Console.Write("\nPress any key to exit.");
            Console.Read();

        }
    }
}
Imports System
Imports System.Collections.ObjectModel
Imports System.IO
Imports System.Text
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlServerCe
Imports Microsoft.Synchronization
Imports Microsoft.Synchronization.Data
Imports Microsoft.Synchronization.Data.SqlServer
Imports Microsoft.Synchronization.Data.SqlServerCe

Namespace Microsoft.Samples.Synchronization
    Class Program
        Shared Sub Main(ByVal args As String())
            ' Create the connections over which provisioning and synchronization
            ' are performed. The Utility class handles all functionality that is not
            ' directly related to synchronization, such as holding connection 
            ' string information and making changes to the server database.
            Dim serverConn As New SqlConnection(Utility.ConnStr_SqlSync_Server)
            Dim clientSqlConn As New SqlConnection(Utility.ConnStr_SqlSync_Client)
            Dim clientSqlCe1Conn As New SqlCeConnection(Utility.ConnStr_SqlCeSync1)

            ' Create a filtered scope template named "customertype_template", and add one table to the scope.
            Dim customerTypeScope As New DbSyncScopeDescription("customertype_template")

            Dim customerDescription As DbSyncTableDescription = SqlSyncDescriptionBuilder.GetDescriptionForTable("Sales.Customer", serverConn)
            customerTypeScope.Tables.Add(customerDescription)

            Dim customerTypeTemplate As New SqlSyncScopeProvisioning(serverConn, customerTypeScope, SqlSyncScopeProvisioningType.Template)
            customerTypeTemplate.Tables("Sales.Customer").AddFilterColumn("CustomerType")
            customerTypeTemplate.Tables("Sales.Customer").FilterClause = "[side].[CustomerType] = @customertype"
            Dim param As New SqlParameter("@customertype", SqlDbType.NVarChar, 100)
            customerTypeTemplate.Tables("Sales.Customer").FilterParameters.Add(param)
            customerTypeTemplate.Apply()

            ' Create a synchronization scope on the server for retail customers.
            Dim serverProvRetail As New SqlSyncScopeProvisioning(serverConn)
            serverProvRetail.PopulateFromTemplate("RetailCustomers", "customertype_template")
            serverProvRetail.Tables("Sales.Customer").FilterParameters("@customertype").Value = "Retail"
            serverProvRetail.Apply()

            ' Create another scope in the server database for wholesale customers.
            Dim serverProvWholesale As New SqlSyncScopeProvisioning(serverConn)
            serverProvWholesale.PopulateFromTemplate("WholesaleCustomers", "customertype_template")
            serverProvWholesale.Tables("Sales.Customer").FilterParameters("@customertype").Value = "Wholesale"
            serverProvWholesale.Apply()

            ' Provision the Sql Server client database SyncSamplesDb_SqlPeer2 with the retail customer scope.
            Dim clientSqlDesc As DbSyncScopeDescription = SqlSyncDescriptionBuilder.GetDescriptionForScope("RetailCustomers", serverConn)
            Dim clientSqlConfig As New SqlSyncScopeProvisioning(clientSqlConn, clientSqlDesc)
            clientSqlConfig.Apply()

            ' Create a SQL Server Compact database and provision it with the wholesale customer scope.
            Utility.DeleteAndRecreateCompactDatabase(Utility.ConnStr_SqlCeSync1, True)
            Dim clientSqlCe1Desc As DbSyncScopeDescription = SqlSyncDescriptionBuilder.GetDescriptionForScope("WholesaleCustomers", serverConn)
            Dim clientSqlCe1Config As New SqlCeSyncScopeProvisioning(clientSqlCe1Conn, clientSqlCe1Desc)
            clientSqlCe1Config.Apply()

            ' Remove the retail customer scope from the Sql Server client database.
            Dim clientSqlDepro As New SqlSyncScopeDeprovisioning(clientSqlConn)

            ' Save the deprovisioning script so it can be run on other SQL Server client databases.
            ' This step is optional.
            File.WriteAllText("SampleDeprovisionScript.txt", clientSqlDepro.ScriptDeprovisionScope("RetailCustomers"))

            ' Remove the scope.
            clientSqlDepro.DeprovisionScope("RetailCustomers")

            ' Remove all scopes from the SQL Server Compact database.
            Dim clientSqlCeDepro As New SqlCeSyncScopeDeprovisioning(clientSqlCe1Conn)
            clientSqlCeDepro.DeprovisionStore()

            ' Remove the "customertype_template" template from the server database. This also removes all of the
            ' scopes that depend on the template.
            Dim serverSqlDepro As New SqlSyncScopeDeprovisioning(serverConn)
            serverSqlDepro.DeprovisionTemplate("customertype_template")

            serverConn.Close()
            serverConn.Dispose()
            clientSqlConn.Close()
            clientSqlConn.Dispose()
            clientSqlCe1Conn.Close()
            clientSqlCe1Conn.Dispose()

            Utility.CleanUpSqlNode(Utility.ConnStr_SqlSync_Server)
            Utility.CleanUpSqlNode(Utility.ConnStr_SqlSync_Client)

            Console.Write(vbLf & "Press any key to exit.")

            Console.Read()
        End Sub
    End Class
End Namespace

См. также

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

Синхронизация SQL Server и SQL Server Compact