Criando aplicativos que usam o controle de alterações (SQL Server Compact)
Começando com o SQL Server Compact 3.5 Service Pack 2 (SP2), o SQL Server Compact expõe uma interface à sua infraestrutura de controle de alterações. Depois que o controle é habilitado em uma tabela em um banco de dados SQL Server Compact, as alterações à tabela - ou seja, as inserções, as atualizações e as exclusões - são controladas pelo SQL Server Compact. Isso também é conhecido como controle de alterações. Você pode usar os dados fornecidos pelo controle de alterações para criar uma variedade de aplicativos avançados. Por exemplo, podem ser usados dados de controle de alterações para criar aplicativos que fornecem serviços de sincronização para Sistemas Ocasionalmente Conectados (OCS) nos quais dispositivos ou computadores precisam conectar e sincronizar dados com um servidor ou com outros pares em uma rede.
Em termos gerais, o SQL Server Compact implementa o controle de alterações:
Adicionando três colunas de sistema às tabelas de usuário nas quais o controle é habilitado.
Criando três tabelas do sistema para armazenar metadados específicos do controle.
Armazenando metadados de controle nas colunas do sistema que são acrescentadas a uma tabela de usuário controlada.
Armazenando metadados de controle nas tabelas do sistema.
Expondo o controle da infraestrutura de controle ao desenvolvedor através de novas classes e acréscimos às classes existentes no namespace System.Data.SqlServerCe.
Observação
Todas as tabelas que começam com "__sys" são tabelas do sistema. Estas tabelas são criadas e mantidas pelo tempo de execução do SQL Server Compact. Os aplicativos não podem alterar nem excluir os dados diretamente em uma tabela do sistema. Alguns métodos na classe SqlCeChangeTracking fornecem a capacidade limitada de trabalhar com as tabelas do sistema. Esses métodos foram anotados, onde apropriado, nas seções a seguir.
As seções restantes neste tópico fornecem informações para ajudá-lo a desenvolver aplicativos criados para usar o controle de alterações.
Números de sequência de transações
O SQL Server Compact usa dois números para identificar a sequência na qual transações (implícitas ou explícitas) que inserem, atualizam ou excluem dados de uma tabela ou de um conjunto de tabelas começam e são confirmadas.
O Número de Sequência Inicial (BSN) é exclusivamente um contador que aumenta de forma monotônica que identifica exclusivamente a sequência na qual transações começam no banco de dados. Ele é atribuído pelo SQL Server Compact quando uma transação começa e é incrementada para a próxima transação começar.
O Número de Sequência de Confirmação (CSN) é um contador que aumenta de forma monotônica que identifica exclusivamente a sequência na qual transações são confirmadas no banco de dados. Ele é atribuído pelo banco de dados quando uma transação é confirmada e é incrementada para a próxima transação a ser confirmada.
O BSN e o CSN identificam exclusivamente a sequência na qual uma transação específica começa e é confirmada em relação a outras transações que estão em operação no banco de dados SQL Server Compacte.
Colunas acrescentadas a tabelas controladas (metadados dentro da linha)
Quando o controle está habilitado em uma tabela, o SQL Server Compact acrescentadas 3 colunas à tabela. Ele armazena metadados sobre alterações que são aplicadas a cada linha em duas dessas colunas; a terceira coluna pode ser usada opcionalmente para armazenar informações de contexto específicas do aplicativo. Quando o controle está desabilitado, as colunas são excluídas.
A tabela a seguir descreve as colunas que são adicionadas para manter esses metadados dentro da linha.
Nome da coluna |
Tipo de dados |
Descrição |
---|---|---|
__sysChangeTxBsn |
binary(8) |
O BSN da última transação para atualizar a linha. |
__sysInsertTxBsn |
binary(8) |
O BSN da transação que inseriu a linha. |
__sysTrackingContext |
uniqueidentifier |
Informações de contexto específicas do aplicativo. Esta coluna é definida de acordo com a propriedade TrackingContext da última transação (SqlCeTransaction) que modificou a linha. Um desenvolvedor pode usar essa propriedade para manter informações específicas do aplicativo. Por exemplo, para identificar o usuário ou o sistema que está alterando os dados. |
Em exclusões, além de excluir a linha da tabela, o SQL Server Compact adiciona uma linha que contém informações sobre a linha excluída para a tabela de marcas de exclusão.
Tabelas do sistema
As tabelas de sistema a seguir são usados no controle de alterações.
A tabela da marca de exclusão.
Quando uma linha é excluída de uma tabela na qual o controle está habilitada, um registro é criado para ela na tabela de marcas de exclusão (__sysOCSDeletedRows). Há uma única tabela de marcas de exclusão no banco de dados e ela contém informações sobre linhas excluídas de quaisquer das tabelas controladas no banco de dados. A tabela a seguir descreve as colunas da tabela de marcas de exclusão.
Nome da coluna |
Tipo de dados |
Descrição |
---|---|---|
__sysTN |
nvarchar(128) |
O nome da tabela de usuário da qual a linha foi excluída. |
__sysDeleteTxBsn |
binary(8) |
O BSN da transação que excluiu a linha. |
__sysInsertTxBsn |
binary(8) |
O BSN da transação que inseriu a linha na tabela do usuário. |
__sysRK |
varbinary(8000) |
A chave de linha. Esta é a chave primária da tabela de usuário ou uma coluna de tipo de dados uniqueidentifier na tabela de usuário que teve o atributo ROWGUIDCOL aplicado (coluna ROWGUID ). A chave de linha identifica exclusivamente a linha de tabela de usuário para o sistema de controle. A chave de linha é armazenada em um formato serializado na tabela de marcas de exclusão. |
__sysDeletedTime |
datetime |
O horário em que a linha foi excluída da tabela de usuário. |
A chave de linha poderá conter uma única coluna da tabela de usuário, no caso de uma chave primária de coluna única ou a coluna ROWGUID, ou poderá conter várias colunas com tipos de dados diferentes se a chave primária for composta de várias colunas. Por isso, a chave de linha é armazenada em um formato serializado na tabela de marcas de exclusão. Você pode usar os métodos PackTombstoneKey e UnpackTombstoneKey para converter para e do formato serializado. Você define o tipo de chave na tabela de usuário (chave primária ou coluna ROWGUID) usada pelo sistema de controle passando um dos valores da enumeração TrackingKeyType como um parâmetro para o método EnableTracking para habilitar o controle na tabela.
Com o tempo, a tabela de marcas de exclusão pode crescer muito. Você pode usar o método PurgeTombstoneTableData para excluir linhas da tabela. Linhas podem ser limpadas da tabela de marcas de exclusão com base no número de dias que se passaram desde que elas foram excluídas da tabela de usuário (uma limpeza com base em hora), ou com base no CSN da transação que excluiu-as (uma limpeza com base em CSN).
A tabela Sequência de Confirmação de Transação
As transações podem ser confirmadas em uma ordem diferente daquela em que começaram (confirmação fora-de-sequência). A Tabela de Sequência de Confirmação (__sysTxCommitSequence) controla essas transações fora-de-sequências. Uma linha será inserida nessa tabela quando uma transação confirmar se essa transação está com uma confirmação fora-de-sequência. A tabela a seguir descreve as colunas da tabela de Sequência de Confirmação de Transação.
Nome da coluna |
Tipo de dados |
Descrição |
---|---|---|
__sysTxBsn |
binary(8) |
O BSN da transação. |
__sysTxCsn |
binary(8) |
O CSN da transação. |
__sysCommitTime |
datetime |
A hora em que a transação foi confirmada. |
Observação
Uma linha só é acrescentada à tabela Sequência de Confirmação de Transação para transações confirmadas fora-de-sequência.
O exemplo a seguir mostra como são inseridas transações na tabela Sequência de Confirmação de Transação.
Considere cinco transações T1, T2, T3, T4 e T5.
Para estas transações, o seguinte é verdadeiro:
A sequência de início de transação (ordem inicial) é: T1, T2, T3, T4, T5.
A sequência de confirmação de transação (ordem de confirmação) é: T1, T3, T4, T2, T5.
Digamos que o CSN e o BSN para este grupo de transações inicie em 1. A tabela a seguir descreve o CSN e o BSN para cada transação, e se uma entrada seria feita ou não na tabela Sequência de Confirmação de Transação para a transação.
T1 |
T2 |
T3 |
T4 |
T5 |
|
---|---|---|---|---|---|
BSN |
1 |
2 |
3 |
4 |
5 |
CSN |
1 |
4 |
2 |
3 |
5 |
Linha inserida em __sysTxCommitSequence? |
Não |
Sim |
Sim |
Sim |
Não |
Com o tempo, o tamanho da Sequência de Confirmação de Transação pode aumentar muito. Você pode usar o método PurgeTransactionSequenceData para excluir linhas desta tabela de sistema. Linhas podem ser limpadas da tabela de marcas de exclusão com base no número de dias que se passaram desde que elas foram adicionadas (uma limpeza com base em hora), ou com base no CSN da transação que excluiu-as (uma limpeza com base em CSN).
Enumerando alterações em uma tabela
As consultas nesta seção fornecem exemplos de como enumerar alterações em uma tabela. O nome da tabela para a qual enumerar alterações é transmitido no parâmetro {0} em cada consulta.
Os seguintes parâmetros também são definidos:
EBSN: Número de Sequência Inicial da Enumeração, o BSN da transação foi intensificado antes de a sincronização começar a enumeração das alterações. Esse valor é usado para evitar a escolha de alterações feitas à tabela durante a enumeração.
ECSN: Número de Sequência de Confirmação da Enumeração, o CSN da transação foi intensificado antes de a sincronização começar a enumeração das alterações. Esse valor é usado para evitar a escolha de alterações feitas à tabela durante a enumeração.
LBSN: Número de Sequência Inicial da Última Sincronização, o EBSN da última sincronização com êxito.
LCSN: Número de Sequência de Confirmação da Última Sincronização, o ECSN da última sincronização com êxito.
Observação
Um carregamento pode ser confirmado independentemente de um download. O LBSN é definido como EBSN e LCSN é definido como ECSN depois que o carregamento é completo e reconhecido.
A seguinte consulta enumera inserções:
private const string cmdEnumerateInserts =
" select ut.* from " +
" (select ut0.* from {0} as ut0 where " +
" ut0.__sysInsertTxBsn IS NOT NULL AND ut0.__sysChangeTxBsn IS NOT NULL AND ut0.__sysChangeTxBsn >= @LBSN " +
" ) as ut " +
" LEFT OUTER JOIN " +
" (select txcs0.* from __sysTxCommitSequence as txcs0) as txcs " +
" ON (ut.__sysInsertTxBsn = txcs.__sysTxBsn) WHERE " +
" (txcs.__sysTxBsn IS NOT NULL and txcs.__sysTxCsn >= @LCSN AND txcs.__sysTxCsn < @ECSN) OR " +
" (txcs.__sysTxBsn IS NULL AND ut.__sysInsertTxBsn >= @LCSN AND ut.__sysInsertTxBsn < @ECSN)";
A seguinte consulta enumera atualizações:
private const string cmdEnumerateUpdates =
" SELECT ut.* FROM " +
" (select ut0.* from {0} as ut0 where " +
" (ut0.__sysChangeTxBsn IS NOT NULL AND ut0.__sysChangeTxBsn >= @LBSN) " +
" ) as ut " +
" LEFT OUTER JOIN" +
" (select txcs0.* from __sysTxCommitSequence as txcs0) as txcs " +
" ON ut.__sysChangeTxBsn = txcs.__sysTxBsn OR txcs.__sysTxBsn IS NULL WHERE " +
" (txcs.__sysTxBsn IS NOT NULL AND txcs.__sysTxCsn >= @LCSN AND txcs.__sysTxCsn < @ECSN) OR " +
" (txcs.__sysTxBsn IS NULL AND ut.__sysChangeTxBsn >= @LCSN AND ut.__sysChangeTxBsn < @ECSN) ";
A seguinte consulta enumera exclusões:
private const string cmdEnumerateDeletes =
" SELECT ut.__sysRK FROM " +
" (select ut0.* from __sysOcsDeletedRows as ut0 where " +
" (ut0.__sysInsertTxCsn IS NULL OR ut0.__sysInsertTxCsn < @LCSN) and " + // Filter INSERT + DELETE
" ut0.__sysTName = \'{0}\'" +
" ) AS ut " +
" LEFT OUTER JOIN " +
" (select txcs0.* from __sysTxCommitSequence as txcs0) as txcs " +
" ON ut.__sysDeleteTxBsn = txcs.__sysTxBsn OR txcs.__sysTxBsn IS NULL WHERE " +
" (txcs.__sysTxBsn IS NOT NULL AND txcs.__sysTxCsn >= @LCSN AND txcs.__sysTxCsn < @ECSN) OR " +
" (txcs.__sysTxBsn IS NULL AND ut.__sysDeleteTxBsn >= @LCSN AND ut.__sysDeleteTxBsn < @ECSN) ";
Controlando o controle de alterações programaticamente
Você pode usar novas classes e também novos métodos e propriedades acrescentados a classes existentes no namespace System.Data.SqlServerCe para configurar e controlar o controle de alterações em bancos de dados do SQL Server Compact. A tabela a seguir fornece uma visão geral breve desses novos artefatos.
Artefato |
Definição |
---|---|
A enumeração PurgeType. |
Contém valores que são usados para especificar se limpezas de dados de controle da tabela de marcas de exclusão ou da tabela Sequência de Confirmação de Transação se baseiam em hora ou no CSN. |
A classe SqlCeChangeTracking. |
A classe principal usada no controle de alterações. Fornece métodos que configuram, habilitam e desabilitam o controle de alterações em tabelas em bancos de dados SQL Server Compact. Também são fornecidos métodos para limpar dados de controle da tabela de marcas de exclusão e a tabela Sequência de Confirmação de Transação; e para atualizar um banco de dados do SQL Server Compact 3.5 SP2 para uso pelo Microsoft Sync Framework 1.0 SP1 e em versões posteriores do Sync Framework. |
A classe SqlCeTransaction |
São adicionadas duas novas propriedades. A propriedade CurrentTransactionBsn retorna o BSN atribuído pelo SQL Server Compact à transação. A propriedade TrackingContext é fornecida para manter informações específicas do aplicativo. Essas informações podem ser definidas pelo desenvolvedor. Quando uma tabela de usuário, na qual o controle está habilitado, é modificada, a coluna __sysTrackingContext na linha modificada é definida como o valor da propriedade TrackingContext. |
A enumeração TrackingKeyType |
Contém valores que especificam o tipo de chave a ser usada para identificar linhas exclusivamente em uma tabela de usuário para a infraestrutura de controle de alterações. Esta pode ser a chave primária definida para a tabela ou uma coluna do tipo de atributo uniqueidentifier de tipo que tem o ROWGUIDCOL aplicado. |
A enumeração TrackingOptions |
Contém valores que especificam os tipos de operações a serem controladas na tabela do usuário. Inserções, atualizações, exclusões ou uma combinação dessas operações podem ser controladas em uma tabela. |