Compartilhar via


Passo a passo: definindo um escopo filtrado e provisionando um servidor

Em geral, é útil criar um escopo que inclua um subconjunto de linhas de uma tabela com base em um valor de filtro em vez de incluir todas as linhas da tabela. Neste passo a passo, você criará um escopo que inclui pedidos com origem no estado NC.

No passo a passo Passo a passo: definindo um escopo e provisionando um servidor, você criou um aplicativo de console que definiu o escopo ProductsScope e provisionou o banco de dados servidor SyncDB com artefatos relacionados ao escopo. O ProductsScope foi definido sem filtro associado a ele. Neste passo a passo, você criará um aplicativo de console que define um escopo filtrado e provisiona o banco de dados servidor SyncDB com artefatos relacionados ao escopo.

Um escopo é um conjunto de tabelas que são sincronizadas como uma única unidade. Algumas ou todas essas tabelas podem ser filtradas. Um escopo com uma ou mais tabelas com filtros especificados é chamado de escopo filtrado. Neste passo a passo, você definirá um escopo filtrado e chamado OrdersScope-NC que contém pedidos armazenados na tabela Orders com o valor da coluna OriginState na tabela definida como NC.

As tabelas em um escopo de sincronização podem já existir no banco de dados, ou podem ser descritas com o modelo de objeto do Sync Framework e, em seguida, geradas em tempo de execução quando o repositório subjacente for sincronizado. Neste passo a passo, você usará a tabela Orders que já existe no banco de dados servidor.

O provisionamento de um banco de dados envolve a adição de artefatos relacionados ao escopo de sincronização, como tabelas de rastreamento, gatilhos e procedimentos armazenados, ao banco de dados. Esses artefatos são usados pelo processo de sincronização em tempo de execução. Opcionalmente, a tabela base também é adicionada ao banco de dados conforme especificado no parágrafo anterior.

Para obter mais detalhes técnicos sobre o provisionamento de escopos filtrados, consulte Como filtrar dados para sincronização de bancos de dados (SQL Server).

Para definir um escopo filtrado e provisionar um servidor

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em Solução ‘SyncSQLServerAndSQLCompact’, aponte para Adicionar e clique em Novo Projeto.

  2. Selecione Visual C# em Tipos de Projeto e selecione Aplicativo do Console em Modelos.

  3. Digite ProvisionServerWithFilteredScope para nome do projeto.

  4. Clique em OK para fechar a caixa de diálogo Novo Projeto.

  5. Na janela Gerenciador de Soluções, clique com o botão direito do mouse em ProvisionServerWithFilteredScope e clique em Adicionar Referência.

  6. Selecione Microsoft.Synchronization, Microsoft.Synchornization.Data, Microsoft.Synchronization.Data.SqlServer e clique em OK para fechar a caixa de diálogo Adicionar Referência.

  7. Adicione as instruções using a seguir ao início do arquivo Program.cs após as instruções using existentes.

    using System.Data;
    using System.Data.SqlClient;
    
    using Microsoft.Synchronization;
    using Microsoft.Synchronization.Data;
    using Microsoft.Synchronization.Data.SqlServer;
    
  8. Adicione a instrução a seguir ao método Main para criar uma conexão SQL com o banco de dados servidor.

    //create connection to the server DB
    SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");
    

    Importante

    Na instrução anterior, substitua o nome do servidor pelo nome da instância do seu servidor, caso não esteja usando a instância padrão. Por exemplo: se o nome de sua instância do SQL Server for MYSQLINSTANCE, substitua (local) por .\MYSQLINSTANCE.

  9. Adicione o código a seguir ao método Main para criar um escopo de sincronização com base na tabela Orders do banco de dados SyncDB. Esse código cria um escopo de sincronização, obtém a descrição da tabela Orders do banco de dados servidor SyncDB e adiciona a descrição da tabela à definição do escopo de sincronização. A lista a seguir contém etapas detalhadas para provisionar um banco de dados servidor com artefatos relacionados a um escopo de sincronização filtrado.

    1. Crie uma instância da classe DbSyncScopeDescription. A classe DbSyncScopeDescription é usada para especificar o nome do escopo de sincronização e a lista de tabelas a serem sincronizadas. As tabelas são especificadas com a classe DbSyncTableDescription.

    2. Crie uma instância da classe DbSyncTableDescription com base no esquema da tabela Orders recuperada do banco de dados servidor SyncDB. A classe DbSyncTableDescription é usada para especificar o nome da tabela, colunas da tabela a serem sincronizadas, tipos de dados da tabela e outras informações necessárias para a sincronização. Essas informações podem ser especificadas explicitamente ou podem ser obtidas através da consulta ao banco de dados usando o método GetDescriptionForTable(String, SqlConnection).

      Neste passo a passo, você usará o método GetDescriptionForTable(String, SqlConnection) da classe SqlSyncDescriptionBuilder para recuperar a descrição da tabela.

    3. Adicione o objeto DbSyncTableDescription à coleção Tables do objeto DbSyncScopeDescription usando o método 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. Adicione o código a seguir ao método Main para provisionar o banco de dados servidor SyncDB com artefatos relacionados à sincronização. Este código cria um objeto SqlSyncScopeProvisioning, define a criação do sinalizador de tabela para Skip porque a tabela já existe no servidor, define a coluna OriginState como a coluna de filtro com valor definido como NC e inicia o processo de provisionamento.

    1. Crie uma instância da classe SqlSyncScopeProvisioning com base no objeto DbSyncScopeDescription e uma conexão com o banco de dados servidor. A classe SqlSyncScopeProvisioning representa o provisionamento de um banco de dados SQL Server para um escopo específico que é representado por um objeto DbSyncScopeDescription.

    2. Invoque o método SetCreateTableDefault(DbSyncCreationOption) especificando o valor DbSyncCreationOption como Skip porque a tabela Orders já existe no banco de dados servidor. O método SetCreateTableDefault(DbSyncCreationOption) é usado para especificar se tabelas base devem ser criadas quando um escopo é configurado.

    3. Especifique a coluna OriginState da tabela Orders como a coluna de filtro e “OriginState = ‘NC’” como a cláusula de filtro da tabela. O método AddFilterColumn(String) permite que você adicione uma coluna que é usada na cláusula de filtro especificada pela propriedade FilterClause. A coluna de filtro é adicionada à tabela de rastreamento que controla as alterações feitas na tabela base. A cláusula de filtro é uma cláusula WHERE sem a palavra-chave WHERE. O alias [side] é um alias para a tabela de rastreamento. Você invoca esses membros no objeto SqlSyncTableProvisioning associado à tabela Orders.

    4. Invoque o método Apply()()()() no objeto SqlSyncScopeProvisioning para iniciar o processo de provisionamento, que cria a infraestrutura de controle de alterações no banco de dados servidor.

    // 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. No Gerenciador de Soluções, clique com o botão direito do mouse em ProvisionServerWithFilteredScope e clique em Compilar.

  12. No Gerenciador de Soluções, clique com o botão direito do mouse em ProvisionServerWithFilteredScope e clique em Definir como Projeto de Inicialização.

  13. Pressione Ctrl+F5 para executar o programa.

  14. Pressione ENTER para fechar a janela do prompt de comando.

  15. No SQL Server Management Studio, expanda o nó SyncDB e Tables. Deverá aparecer a tabela Orders_Tracking a seguir criada pelo processo de provisionamento. Há outros objetos, como gatilhos e procedimentos armazenados, criados pelo processo de provisionamento.

  16. Mantenha o Visual Studio aberto para executar o próximo passo a passo.

Exemplo de código completo

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 connection to the server DB
            SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

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

            // gets 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();
        }
    }
}

Consulte também

Outros recursos

Como filtrar dados para sincronização de bancos de dados (SQL Server)