Построение приложений, использующих отслеживание изменений (SQL Server Compact)

Начиная с версии SQL Server Compact 3.5 с пакетом обновления 2 (SP2), SQL Server Compact реализует интерфейс для инфраструктуры отслеживания изменений. После включения отслеживания для таблицы в базе данных SQL Server Compact все изменения в этой таблице — вставки, обновления и удаления — отслеживаются SQL Server Compact. Это также называется отслеживанием изменений. На основе данных, поставляемых функцией отслеживания изменений, можно создать множество полезных приложений. Например, результаты отслеживания изменений можно использовать для создания приложений, которые обеспечивают синхронизацию для непостоянно подключенных систем (OCS), где компьютеры и мобильные устройства производят подключение и синхронизацию данных с сервером или другими узлами сети.

В общем случае SQL Server Compact реализует отслеживание изменений следующими средствами:

  • Добавление в пользовательские таблицы трех системных столбцов, по которым и осуществляется отслеживание.

  • Создание трех системных таблиц для сохранения метаданных отслеживания изменений.

  • Сохранение метаданных отслеживания в системных столбцах, которые добавляются к отслеживаемым пользовательским таблицам.

  • Сохранение метаданных отслеживания в системных таблицах.

  • Доступ разработчиков к управлению инфраструктурой отслеживания через новые классы и дополнения к существующим классам пространства имен System.Data.SqlServerCe.

Примечание

Все таблицы, имена которых начинаются с "__sys", являются системными. Эти таблицы создаются и обслуживаются средой выполнения SQL Server Compact. Приложения не могут напрямую изменять или удалять данные в системных таблицах. Некоторые из методов класса SqlCeChangeTracking предусматривают ограниченную функциональность для работы с системными таблицами. Эти методы соответствующим образом помечены в следующих подразделах.

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

Порядковые номера транзакций

SQL Server Compact использует два числа для идентификации очередности, в которой начинаются и фиксируются транзакции (как явные, так и неявные), в которых производится вставка, обновление и удаление данных в таблице (или группе таблиц).

  • Порядковый номер начала (BSN) — это монотонно возрастающее число, которое уникальным образом идентифицирует порядковый номер начала транзакции в базе данных. SQL Server Compact назначает его в момент начала транзакции и увеличивает при начале следующей транзакции.

  • Порядковый номер фиксации (CSN) — это монотонно возрастающее число, которое уникальным образом идентифицирует порядковый номер фиксации транзакции в базе данных. База данных назначает его в момент фиксации транзакции и увеличивает при фиксации следующей транзакции.

Значения BSN и CSN уникальным образом идентифицируют порядок, в котором была начата и зафиксирована транзакция относительно других транзакций в базе данных SQL Server Compact.

Столбцы, добавляемые в отслеживаемые таблицы (внутристроковые метаданные)

Когда для пользовательской таблицы включено отслеживание, SQL Server Compact добавляет в нее три столбца. В двух из них сохраняются метаданные об изменениях, примененных к строке, а третий столбец может быть использован для сохранения сведений о контексте, определяемых приложением. При отключении отслеживания эти столбцы удаляются.

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

Имя столбца

Тип данных

Описание

__sysChangeTxBsn

binary(8)

BSN последней транзакции, в которой была обновлена строка.

__sysInsertTxBsn

binary(8)

BSN транзакции, в которой была вставлена строка.

__sysTrackingContext

uniqueidentifier

Сведения о контексте, определяемые приложением. Этот столбец устанавливается в соответствии со свойством TrackingContext последней транзакции (SqlCeTransaction), в которой строка была изменена. Разработчик может использовать это свойство для сохранения сведений, определяемых приложением. Например, он может определять пользователя или систему, которой были изменены данные.

При удалении, кроме удаления строки из таблицы, SQL Server Compact добавляет строку, которая содержит сведения об удаленной строке, в таблицу полного удаления.

Системные таблицы

При отслеживании изменений используются следующие системные таблицы.

Таблица полного удаления

Когда строка удаляется из таблицы, для которой включено отслеживание изменений, в таблице полного удаления (__sysOCSDeletedRows) для нее создается строка. В базе данных существует всего одна таблица полного удаления, которая содержит сведения обо всех строках, удаленных из всех отслеживаемых таблиц в этой базе данных. В следующей таблице описаны столбцы таблицы полного удаления.

Имя столбца

Тип данных

Описание

__sysTN

nvarchar(128)

Имя пользовательской таблицы, из которой была удалена строка.

__sysDeleteTxBsn

binary(8)

BSN транзакции, в которой была удалена строка.

__sysInsertTxBsn

binary(8)

BSN транзакции, в которой строка была вставлена в пользовательскую таблицу.

__sysRK

varbinary(8000)

Ключ строки. Это либо первичный ключ пользовательской таблицы, либо столбец типа данных uniqueidentifier из нее, к которому применен атрибут ROWGUIDCOL (столбец ROWGUID). Ключ строки уникальным образом идентифицирует строку пользовательской таблицы в системе отслеживания. Ключ строки хранится в таблице полного удаления в сериализованном формате.

__sysDeletedTime

datetime

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

Ключ строки может состоять из одного столбца пользовательской таблицы (если первичный ключ состоит из одного столбца либо ключом служит столбец ROWGUID) либо из нескольких столбцов различных типов данных, если первичный ключ пользовательской таблицы состоит из нескольких столбцов. В этом случае ключ строки хранится в таблице полного удаления в сериализованном формате. Для преобразования данных в этот формат и обратно можно пользоваться методами PackTombstoneKey и UnpackTombstoneKey. Чтобы задать тип ключа для пользовательской таблицы (первичный ключ или столбец ROWGUID), используемый при отслеживании изменений, передайте одно из значений перечисления TrackingKeyType в качестве параметра методу EnableTracking при включении отслеживания для таблицы.

Через некоторое время таблица полного удаления разрастется до больших размеров. Удалить строки из нее можно с помощью метода PurgeTombstoneTableData. Очистку строк из таблицы полного удаления можно выполнить исходя из давности удаления строк (очистка по времени) либо по номеру CSN транзакции, в которой они были удалены (очистка по CSN).

Таблица очередности фиксации транзакций

Транзакции могут фиксироваться не в том порядке, в котором они начинались (фиксация вне очереди). Таблица очередности фиксации транзакций (__sysTxCommitSequence) служит для отслеживания таких транзакций. В эту таблицу вставляется строка при каждой фиксации транзакций, если для транзакции производится фиксация вне очереди. В следующей таблице описаны столбцы таблицы порядка фиксации транзакций.

Имя столбца

Тип данных

Описание

__sysTxBsn

binary(8)

BSN транзакции.

__sysTxCsn

binary(8)

CSN транзакции.

__sysCommitTime

datetime

Время фиксации транзакции.

Примечание

Строки добавляются в таблицу порядка фиксации транзакций только для тех транзакций, фиксация которых производится вне очереди.

Следующий пример показывает, каким образом транзакции вставляются в таблицу порядка фиксации транзакций.

Предположим, есть пять транзакций — T1, T2, T3, T4 и T5.

Для этих транзакций выполняются следующие условия.

Порядок создания транзакций (очередность начала): T1, T2, T3, T4, T5.

Порядок фиксации транзакций (очередность фиксации): T1, T3, T4, T2, T5.

Предположим, что CSN и BSN для этой группы транзакций начинается с 1. В следующей таблице для каждой из транзакций приведены CSN и BSN, а также наличие записи о ней в таблице очередности фиксации транзакций.

T1

T2

T3

T4

T5

BSN

1

2

3

4

5

CSN

1

4

2

3

5

Строка вставлена в __sysTxCommitSequence?

Нет

Да

Да

Да

Нет

Со временем таблица очередности фиксации транзакций может существенно вырасти. Удалить строки из этой системной таблицы можно с помощью метода PurgeTransactionSequenceData. Очистку строк из таблицы можно выполнить исходя из срока их добавления (очистка по времени) либо по номеру CSN транзакции (очистка по CSN).

Перечисление изменений в таблице

Приведенные в этом подразделе запросы показывают, как перечислить изменения в таблице. Имя таблицы, для которой необходимо перечислить изменения, передается в каждом запросе в параметре {0}.

Кроме того, определены следующие параметры.

  • EBSN: порядковый номер начала перечисления, BSN транзакции, захваченной перед тем, как синхронизация начинает перечисление изменений. Это значение служит для того, чтобы исключить изменения, сделанные во время перечисления. 

  • ECSN: порядковый номер фиксации перечисления, CSN транзакции, захваченной перед тем, как синхронизация начинает перечисление изменений. Это значение служит для того, чтобы исключить изменения, сделанные во время перечисления. 

  • LBSN: последний порядковый номер начала синхронизации, EBSN последней успешной синхронизации.

  • LCSN: последний порядковый номер фиксации синхронизации, ECSN последней успешной синхронизации.

Примечание

Передача может фиксироваться независимо от загрузки. После того как передача завершена и подтверждена, LBSN устанавливается в EBSN, а LCSN — в ECSN.

Следующий запрос перечисляет операции вставки.

        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)";

Следующий запрос перечисляет операции обновления.

        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) ";

Следующий запрос перечисляет операции удаления.

        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) ";

Программное управление отслеживанием изменений

Новые классы и новые методы, добавленные к существующим классам в пространстве имен System.Data.SqlServerCe, предназначены для настройки и управления отслеживанием изменений в базе данных SQL Server Compact. В следующей таблице приведены общие сведения об этих новых артефактах.

Артефакт

Определение

Перечисление PurgeType

Содержит значения, которые указывают способ очистки данных изменений из таблицы полного удаления и таблицы очередности фиксации транзакций — по времени или по CSN.

Класс SqlCeChangeTracking.

Главный класс, используемый в отслеживании изменений. Содержит методы для настройки, включения и отключения отслеживания изменений для таблиц в базах данных SQL Server Compact. В число методов этого класса входят также методы для очистки данных отслеживания из таблицы полного удаления и таблицы очередности фиксации транзакций, а также методы для обновления базы данных SQL Server Compact 3.5 с пакетом обновления 2 (SP2) для использования Microsoft Sync Framework 1.0 с пакетом обновления 1 (SP1) и более поздних версий Sync Framework.

Класс SqlCeTransaction.

Добавлено два новых свойства. Свойство CurrentTransactionBsn возвращает BSN, назначенный SQL Server Compact транзакции. Свойство TrackingContext предназначено для сохранения данных, определяемых приложением. Эти данные определяются разработчиком. При изменении в таблице пользователя, для которого включено отслеживание, столбец __sysTrackingContext в измененной строке будет содержать значение свойства TrackingContext.

Перечисление TrackingKeyType

Содержит значения, которые указывают тип ключа, используемого инфраструктурой отслеживания изменений для уникальной идентификации строк в пользовательской таблице. Это может быть либо первичный ключ, определенный для таблицы, либо столбец типа uniqueidentifier, к которому применен атрибут ROWGUIDCOL.

Перечисление TrackingOptions

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

См. также

Справочник

System.Data.SqlServerCe

SqlCeChangeTracking