Procédure : approvisionner et annuler l'approvisionnement des modèles et des étendues de synchronisation (SQL Server)
Cette rubrique explique comment supprimer des modèles et des étendues de synchronisation d'une base de données SQL Server, SQL Azure ou SQL Server Compact. Les exemples de cette rubrique reposent sur les classes Sync Framework suivantes :
Pour plus d'informations sur le mode d'exécution de l'exemple de code, consultez « Exemples d'application dans les rubriques de procédures » dans Synchronisation de SQL Server et SQL Server Compact.
Présentation de l'approvisionnement et de l'annulation de l'approvisionnement
La première étape de configuration d'une base de données en vue de sa synchronisation consiste à définir une étendue qui identifie ce que vous voulez synchroniser. Après avoir défini l'étendue de la synchronisation, vous approvisionnez la base de données de façon à créer une infrastructure de suivi des modifications et de gestion des métadonnées qui est constituée de tables de métadonnées, de déclencheurs et de procédures stockées. Cette infrastructure est nécessaire pour que Sync Framework synchronise une étendue. Une fois qu'une base de données a été approvisionnée, elle peut être synchronisée avec d'autres membres de la communauté de synchronisation à l'aide d'un fournisseur, tel que SqlSyncProvider, pour représenter la base de données, et d'un objet SyncOrchestrator pour gérer la session de synchronisation et établir la connexion à un autre fournisseur de synchronisation. L'approvisionnement d'une base de données pour la synchronisation est une tâche distincte de la synchronisation avec d'autres bases de données et le code d'approvisionnement d'une base de données est généralement contenu dans une application séparée de celui utilisé pour la synchronisation.
Les objets d'approvisionnement utilisés pour approvisionner une base de données SQL Server ou SQL Azure peuvent être configurés pour créer certains ou l'ensemble des éléments suivants dans une base de données lorsqu'elle est approvisionnée. L'option par défaut pour la création des éléments de synchronisation est CreateOrUseExisting, ce qui signifie qu'un élément sera créé sauf s'il existe déjà dans la base de données :
Tables de base qui sont contenues dans l'étendue de synchronisation. Après l'approvisionnement, les tables de base sont vides. Les données elles-mêmes sont copiées lorsque la base de données est synchronisée pour la première fois. Lorsque plusieurs tables sont ajoutées à une étendue de synchronisation, elles sont créées dans l'ordre dans lequel elles sont ajoutées. Lorsqu'une table contient une relation de clé étrangère à une clé primaire dans une autre table de l'étendue, ajoutez d'abord la table de clé primaire et ensuite la table de clé étrangère afin que les relations de clés étrangères soient correctement résolues. La création des tables de base est contrôlée par la méthode SetCreateTableDefault.
Une table de suivi pour chaque table de base qui figure dans l'étendue. La table de suivi effectue le suivi des modifications qui sont apportées à la table de base associée. La création des tables de suivi est contrôlée par la méthode SetCreateTrackingTableDefault. Lorsqu'une table fait déjà partie d'une autre étendue et que la nouvelle étendue ajoute une colonne de filtrage qui ne figurait pas dans l'étendue d'origine, Sync Framework ajoute automatiquement la colonne de filtrage à la table de suivi et la remplit avec les valeurs appropriées.
Déclencheurs qui mettent à jour une table de suivi lorsque des modifications sont apportées directement à une table de base. La création des déclencheurs est contrôlée par la méthode SetCreateTriggersDefault.
Procédures stockées pour les actions de synchronisation, telles que l'énumération des modifications, l'insertion d'une modification, la mise à jour des données ou la suppression des données. La création des procédures stockées est contrôlée par la méthode SetCreateProceduresDefault. Lorsqu'une table fait déjà partie d'une autre étendue et que la nouvelle étendue ajoute une colonne de filtrage qui ne figurait pas dans l'étendue d'origine, vous devez appeler la méthode SetCreateProceduresForAdditionalScopeDefault et spécifier l'option Create pour créer une procédure d'énumération supplémentaire qui contient la colonne de filtrage dans sa liste de paramètres. Des procédures en bloc qui utilisent des paramètres table pour effectuer les actions d'insertion, de mise à jour et de suppression pour plusieurs lignes simultanément sont également créées pour les bases de données SQL Server 2008 et SQL Azure. La création des procédures en bloc est contrôlée par la méthode SetUseBulkProceduresDefault. Sachez qu'après la création de procédures en bloc pour une table, celles-ci sont toujours utilisées pour l'ensemble des étendues qui incluent la table, même les étendues qui spécifiaient de ne pas utiliser de procédures en bloc. De plus, si une table a déjà été approvisionnée pour une autre étendue qui utilise des procédures en bloc, la spécification de la valeur false pour SetUseBulkProceduresDefault n'a aucun effet.
Des entrées sont ajoutées à des tables spéciales, par exemple une table scope_info, qui contiennent des informations sur les étendues incluses dans la base de données. Si ces tables n'existent pas déjà, elles sont créées.
Les éléments de synchronisation peuvent être collectés dans un schéma séparé de la base de données. Pour ce faire, spécifiez le nom du schéma dans la propriété SqlSyncScopeProvisioning..::..ObjectSchema. Le schéma doit déjà exister dans la base de données. Si vous utilisez un schéma lorsque vous approvisionnez une base de données, vous devez spécifier le même schéma chaque fois que l'étendue est utilisée. Par exemple, vous devez indiquer la propriété SqlSyncProvider..::..ObjectSchema lors de la synchronisation de la base de données.
Les éléments de synchronisation peuvent être précédés d'une chaîne. Pour ce faire, spécifiez le préfixe dans la méthode SqlSyncScopeProvisioning..::..ObjectPrefix ou SqlCeSyncScopeProvisioning..::..ObjectPrefix. Si vous utilisez un préfixe lorsque vous approvisionnez une base de données, vous devez spécifier le même préfixe chaque fois que l'étendue est utilisée. Par exemple, vous devez indiquer la propriété SqlSyncProvider..::..ObjectPrefix lors de la synchronisation de la base de données.
L'approvisionnement peut être appliqué directement en appelant la méthode SqlSyncScopeProvisioning..::..Apply ou SqlCeSyncScopeProvisioning..::..Apply, ou, pour une base de données SQL Server, un script peut être créé et exécuté ultérieurement. Pour créer un script, appelez la méthode SqlSyncScopeProvisioning..::..Script.
Lorsque vous n'avez plus besoin d'une étendue, vous pouvez la supprimer, ainsi que les tables de métadonnées, les déclencheurs et les procédures stockées associés en appelant SqlSyncScopeDeprovisioning..::..DeprovisionScope ou SqlCeSyncScopeDeprovisioning..::..DeprovisionScope. Lorsqu'une étendue est supprimée, elle ne peut plus être utilisée pour la synchronisation. Si un élément de base de données, tel qu'une table de métadonnées, est utilisé par plusieurs étendues, cet élément ne peut pas être supprimé tant que la dernière étendue qui l'utilise n'est pas supprimée. Par exemple, vous disposez d'une table nommée Customers et vous définissez deux étendues nommées RetailCustomers et WholesaleCustomers qui contiennent la table Customers. Si vous supprimez l'étendue WholesaleCustomers, la table de métadonnées de la table Customers ne sera pas supprimée, car elle est encore utilisée par l'étendue RetailCustomers.
Si vous utilisez un filtre basé sur les paramètres pour filtrer les données de synchronisation dans une base de données SQL Server ou SQL Azure, vous créez d'abord un modèle de filtre, puis des étendues filtrées basées sur le modèle. Vous pouvez également supprimer aisément le modèle de filtre et toutes les étendues filtrées créées à partir de ce dernier, ainsi que l'ensemble des tables de métadonnées, déclencheurs et procédures stockées en appelant DeprovisionTemplate. Par exemple, vous créez un modèle customerstate_template qui filtre à l'aide du paramètre state. Vous créez deux étendues filtrées, customers_WA et customers_OR, lesquelles sont basées sur customerstate_template. Lorsque vous supprimez customerstate_template, customers_WA et customers_OR sont également supprimées. Pour plus d'informations sur les filtres basés sur des paramètres, consultez Procédure : filtrer des données pour la synchronisation de bases de données (SQL Server).
Vous pouvez également supprimer tous les filtres et étendues, ainsi que la totalité des tables de métadonnées, des déclencheurs et des procédures stockées de synchronisation d'une base de données en appelant SqlSyncScopeDeprovisioning..::..DeprovisionStore ou SqlCeSyncScopeDeprovisioning..::..DeprovisionStore. Par ailleurs, étant donné que la suppression d'étendues individuelles et de modèles de filtre supprime uniquement les métadonnées au niveau de l'étendue et du modèle, et non les métadonnées au niveau de la base de données, SqlSyncScopeDeprovisioning..::..DeprovisionStore ou SqlCeSyncScopeDeprovisioning..::..DeprovisionStore peut être utilisé pour nettoyer les tables de métadonnées de synchronisation restantes une fois l'ensemble des étendues et modèle supprimé.
Notes
Les composants de synchronisation ne sont pas supprimés de la base de données tant que toutes les étendues qui en dépendent ne voient pas leur approvisionnement annulé. Par exemple, lorsque deux étendues qui contiennent une même table sont présentes dans une base de données, l'annulation de l'approvisionnement de l'une de ces étendues ne supprime pas les métadonnées de la table contenue dans l'autre étendue. Lorsque l'approvisionnement de la deuxième étendue est annulé, la table de métadonnées est supprimée.
Approvisionnement de bases de données
L'exemple suivant approvisionne une base de données SQL Server serveur avec un modèle de filtre nommé customertype_template, puis crée deux étendues filtrées nommées RetailCustomers et WholesaleCustomers à partir de ce modèle. Une base de données SQL Server client est approvisionnée avec l'étendue RetailCustomers et une base de données SQL Server Compact client est approvisionnée avec l'étendue 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()
Annulation de l'approvisionnement de bases de données
Les exemples de code suivants vous indiquent comment effectuer les actions suivantes :
Annuler l'approvisionnement d'une seule étendue à partir de l'une des bases de données client.
Annuler l'approvisionnement d'un modèle d'étendue filtrée et de toutes les étendues associées à partir de la base de données serveur.
Annuler l'approvisionnement de l'intégralité d'une base de données client afin que tous les composants de synchronisation soient supprimés.
Suppression d'une étendue
L'exemple suivant supprime l'étendue RetailCustomers de la base de données SQL Server client. À titre d'exemple supplémentaire, le script utilisé pour supprimer l'étendue est également enregistré dans un fichier. Ce script peut être exécuté sur d'autres bases de données pour supprimer l'étendue RetailCustomers. Cette étape est facultative et il n'est pas nécessaire d'annuler l'approvisionnement d'une étendue.
// 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")
Suppression d'un modèle de filtre
Avant de supprimer un modèle de filtre, il peut être utile de rechercher les étendues filtrées créées à partir du modèle, car toutes ces étendues seront supprimées lors de l'annulation de l'approvisionnement du modèle de filtre. L'exemple de script suivant montre comment rechercher les noms des étendues filtrées créées à partir du modèle de filtre 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')
L'exemple suivant supprime le modèle customertype_template de la base de données SQL Server serveur. La suppression du modèle supprime également les étendues RetailCustomers et WholesaleCustomers de la base de données.
// 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")
Suppression de tous les objets de synchronisation
L'exemple suivant supprime l'ensemble des tables de métadonnées, des déclencheurs et des procédures stockées de synchronisation de la base de données client 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()
Exemple de code complet
L'exemple de code complet ci-dessous inclut les exemples de code décrits précédemment, ainsi que du code supplémentaire permettant de configurer et de nettoyer les bases de données. L'exemple requiert la classe Utility qui est disponible dans Classe d'utilitaire pour les rubriques de procédures sur le fournisseur de bases de données.
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