Como provisionar e desprovisionar escopos e modelos de sincronização (SQL Server)
Este tópico mostra como remover escopos e modelos de sincronização de um banco de dados do SQL Server, do SQL Azure ou do SQL Server Compact. Os exemplos neste tópico se concentram nas seguintes classes do Sync Framework:
Para obter mais informações sobre como executar o código de exemplo, consulte "Exemplo de aplicativos nos tópicos de instruções" em Sincronizando o SQL Server e o SQL Server Compact.
Noções básicas sobre provisionamento e desprovisionamento
A primeira etapa para configurar um banco de dados para sincronização é definir um escopo que identifique o que você deseja sincronizar. Após definir o escopo de sincronização, provisione o banco de dados para criar uma infraestrutura de controle de alterações e gerenciamento de metadados que consiste em tabelas de metadados, gatilhos e procedimentos armazenados. Essa infraestrutura é necessária para que Sync Framework sincronize um escopo. Após ser provisionado, um banco de dados pode sincronizar com outros membros da comunidade de sincronização usando um provedor, como SqlSyncProvider, para representar o banco de dados, e um objeto SyncOrchestrator para gerenciar a sessão de sincronização e conectar-se a outro provedor de sincronização. O provisionamento de um banco de dados para sincronização é uma tarefa separada da sincronização com outros bancos de dados, e o código para provisionar um banco de dados em geral está contido em um aplicativo separado daquele usado para sincronização.
Os objetos de provisionamento usados para provisionar um banco de dados SQL Server ou SQL Azure podem ser configurados para criar alguns ou todos os elementos a seguir em um banco de dados quando ele é provisionado. A opção padrão para criar elementos de sincronização é CreateOrUseExisting, o que significa que um elemento será criado, a menos que ele já exista no banco de dados:
As tabelas base estão contidas no escopo de sincronização. Depois do provisionamento, as tabelas base ficam vazias. Os próprios dados são copiados quando o banco de dados é sincronizado pela primeira vez. Quando várias tabelas são adicionadas a um escopo de sincronização, elas são criadas na ordem em que são adicionadas. Quando uma tabela contiver uma relação de chave estrangeira com uma chave primária em outra tabela do escopo, adicione primeiro a tabela de chave primária e depois a tabela de chave estrangeira para que relações de chave estrangeira sejam resolvidas adequadamente. A criação de tabelas base é controlada pelo método SetCreateTableDefault.
Uma tabela de rastreamento para cada tabela base do escopo. A tabela de rastreamento controla as alterações feitas na tabela base associada. A criação de tabelas de rastreamento é controlada pelo método SetCreateTrackingTableDefault. Quando uma tabela já faz parte de outro escopo e o novo escopo adiciona uma coluna de filtro que não estava no escopo original, o Sync Framework adiciona automaticamente a coluna de filtro à tabela de rastreamento e a popula com os valores apropriados.
Gatilhos que atualizam uma tabela de rastreamento quando as alterações são feitas diretamente em uma tabela base. A criação de gatilhos é controlada pelo método SetCreateTriggersDefault.
Procedimentos armazenados para ações de sincronização, como a enumeração de alterações, a inserção de uma alteração, a atualização de dados ou a exclusão de dados. A criação de procedimentos armazenados é controlada pelo método SetCreateProceduresDefault. Quando uma tabela já fizer parte de outro escopo e o novo escopo adicionar uma coluna de filtro que não estava no escopo original, chame o método SetCreateProceduresForAdditionalScopeDefault e especifique a opção Create para criar um procedimento de enumeração adicional que contenha a coluna de filtro na sua lista de parâmetros. Também são criados procedimentos em massa que utilizam parâmetros com valor de tabela para executar ações de inserção, atualização e exclusão para várias linhas de uma vez para o SQL Server 2008 e o SQL Azure. A criação de procedimentos em massa é controlada pelo método SetUseBulkProceduresDefault. Saiba que, após a criação dos procedimentos em massa para uma tabela, eles sempre serão usados para todos os escopos que incluam a tabela, mesmo escopos que especifiquem que os procedimentos em massa não devam ser usados. Além disso, se uma tabela já tiver sido provisionada para outro escopo que use procedimentos em massa, a especificação de false como SetUseBulkProceduresDefault não terá nenhum efeito.
Entradas são adicionadas a tabelas especiais, como uma tabela scope_info, que contém informações sobre os escopos contidos no banco de dados. Se essas tabelas ainda não existirem, elas serão criadas.
Os elementos de sincronização podem ser coletados em um esquema separado no banco de dados. Para fazer isso, especifique o nome do esquema na propriedade SqlSyncScopeProvisioning..::..ObjectSchema. O esquema já deve existir no banco de dados. Se você usar um esquema ao provisionar um banco de dados, especifique o mesmo esquema sempre que o escopo for usado. Por exemplo, especifique a propriedade SqlSyncProvider..::..ObjectSchema quando o banco de dados for sincronizado.
Os elementos de sincronização podem ser prefixados com uma cadeia de caracteres. Para fazer isso, especifique o prefixo no método SqlSyncScopeProvisioning..::..ObjectPrefix ou SqlCeSyncScopeProvisioning..::..ObjectPrefix. Se você usar um prefixo ao provisionar um banco de dados, especifique o mesmo prefixo sempre que o escopo for usado. Por exemplo, especifique a propriedade SqlSyncProvider..::..ObjectPrefix quando o banco de dados for sincronizado.
O provisionamento pode ser aplicado diretamente chamando o método SqlSyncScopeProvisioning..::..Apply ou SqlCeSyncScopeProvisioning..::..Apply ou, para um banco de dados do SQL Server, um script pode ser criado ou executado posteriormente. Para criar um script, chame o método SqlSyncScopeProvisioning..::..Script.
Se você não precisar mais de um escopo, poderá remover o escopo e suas tabelas de metadados, gatilhos e procedimentos armazenados associados chamando SqlSyncScopeDeprovisioning..::..DeprovisionScope ou SqlCeSyncScopeDeprovisioning..::..DeprovisionScope. Após a remoção de um escopo, não será mais possível usá-lo para sincronização. Se um elemento de banco de dados, como uma tabela de metadados, for usado por mais de um escopo, ele não será removido até que o último escopo usado seja removido. Por exemplo, você tem uma tabela denominada Customers e define dois escopos denominados RetailCustomers e WholesaleCustomers, que contêm a tabela Customers. Quando você remove o escopo WholesaleCustomers, a tabela de metadados da tabela Customers não é removida, pois ela ainda está sendo usada pelo escopo RetailCustomers.
Se você usar um filtro baseado em parâmetros para filtrar os dados de sincronização em um banco de dados do SQL Server ou do SQL Azure, primeiro crie um modelo de filtro e depois crie escopos filtrados com base no modelo de filtro. Você também pode facilmente remover o modelo de filtro e todos os escopos filtrados que foram criados com base nele, e também todas as tabelas de metadados, gatilhos e procedimentos armazenados associados chamando DeprovisionTemplate. Por exemplo, você cria um modelo customerstate_template que filtra usando um parâmetro state. Você cria dois escopos filtrados, customers_WA e customers_OR, que se baseiam no customerstate_template. Quando você remove customerstate_template, customers_WA e customers_OR também são removidos. Para obter mais informações sobre filtros baseados em parâmetros, consulte Como filtrar dados para sincronização de bancos de dados (SQL Server).
Também é possível remover todos os escopos e filtros e todas as tabelas de metadados, gatilhos e procedimentos armazenados de sincronização de um banco de dados chamando SqlSyncScopeDeprovisioning..::..DeprovisionStore ou SqlCeSyncScopeDeprovisioning..::..DeprovisionStore. Além disso, como a remoção de escopos e modelos de filtros separados remove apenas metadados em nível de escopo e modelo, e não metadados em nível de banco de dados, SqlSyncScopeDeprovisioning..::..DeprovisionStore ou SqlCeSyncScopeDeprovisioning..::..DeprovisionStore pode ser usado para limpar as tabelas de metadados de sincronização restantes depois da remoção de todos os escopos e modelos.
Dica
Os componentes de sincronização não serão removidos de um banco de dados até que todos os escopos que dependem deles sejam desprovisionados. Por exemplo, quando dois escopos que contêm a mesma tabela estão presentes em um banco de dados, o desprovisionamento de um dos escopos não remove a tabela de metadados da tabela contida no outro escopo. Quando o segundo escopo é desprovisionado, a tabela de metadados é removida.
Provisionando bancos de dados
O exemplo a seguir provisiona um banco de dados do SQL Server de servidor com um modelo de filtro denominado customertype_template e cria dois escopos filtrados com base nele denominados RetailCustomers e WholesaleCustomers. Um banco de dados cliente do SQL Server é provisionado com o escopo RetailCustomers e um banco de dados cliente do SQL Server Compact é provisionado com o escopo 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()
Desprovisionando bancos de dados
Os seguintes códigos de exemplo mostram como executar estas ações:
Desprovisione um único escopo de um dos bancos de dados cliente.
Desprovisione um modelo de escopo filtrado e todos os escopos associados do banco de dados servidor.
Desprovisione um banco de dados cliente inteiro para que todos os componentes de sincronização sejam removidos.
Removendo um escopo
O exemplo a seguir remove o escopo RetailCustomers do banco de dados cliente do SQL Server. Como um exemplo adicional, o script usado para remover o escopo também é salvo em arquivo. Esse script pode ser executado em outros bancos de dados para remover o escopo RetailCustomers. Esta etapa é opcional e não é necessária para desprovisionar um escopo.
// 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")
Removendo um modelo de filtro
Antes de remover um modelo de filtro, convém localizar os escopos filtrados que foram criados a partir do modelo, porque todos esses escopos serão removidos quando o modelo de filtro for desprovisionado. O script de exemplo a seguir mostra como localizar os nomes dos escopos filtrados que foram criados a partir do modelo de filtro 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')
O exemplo a seguir remove o modelo customertype_template do banco de dados servidor do SQL Server. A remoção do modelo também remove os escopos RetailCustomers e WholesaleCustomers desse banco de dados.
// 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")
Removendo todos os objetos de sincronização
O exemplo a seguir remove todas as tabelas de metadados, gatilhos e procedimentos armazenados de sincronização do banco de dados do SQL Server Compact cliente.
// 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()
Exemplo de código completo
O exemplo de código completo a seguir inclui os exemplos de código descritos anteriormente e o código adicional para configurar e limpar os bancos de dados. O exemplo requer a classe Utility disponível em Classe de utilitário para tópicos de instruções do provedor de banco de dados.
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