使用變更追蹤的建立應用程式 (SQL Server Compact)
從 SQL Server Compact 3.5 Service Pack 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 就會將 3 個資料行加入至資料表。它會將套用至每個資料列之變更的相關中繼資料儲存在其中兩個資料行中。第三個資料行可選擇性地用來儲存應用程式特有的內容資訊。停用追蹤時,系統就會刪除這些資料行。
下表將描述加入以保存此同資料列中繼資料的資料行。
資料行名稱 |
資料類型 |
說明 |
---|---|---|
__sysChangeTxBsn |
binary(8) |
更新資料列之最後一筆交易的 BSN。 |
__sysInsertTxBsn |
binary(8) |
插入資料列之交易的 BSN。 |
__sysTrackingContext |
uniqueidentifier |
應用程式特有的內容資訊。這個資料行是根據修改資料列之最後一筆交易 (SqlCeTransaction) 的 TrackingContext 屬性所設定。開發人員可以使用這個屬性來保存應用程式特有的資訊。例如,識別變更資料的使用者或系統。 |
進行刪除時,除了從資料表中刪除資料列以外,SQL Server Compact 還會將包含已刪除資料列之相關資訊的資料列加入至標記資料表。
系統資料表
下列系統資料表會用於變更追蹤。
標記資料表
從啟用追蹤的資料表中刪除某個資料列之後,系統就會在標記資料表 (__sysOCSDeletedRows) 中建立該資料列的記錄。資料庫具有單一標記資料表,而且它會包含從資料庫內任何追蹤資料表中刪除之資料列的相關資訊。下表將描述標記資料表的資料行。
資料行名稱 |
資料類型 |
說明 |
---|---|---|
__sysTN |
nvarchar(128) |
從中刪除資料列之使用者資料表的名稱。 |
__sysDeleteTxBsn |
binary(8) |
刪除資料列之交易的 BSN。 |
__sysInsertTxBsn |
binary(8) |
將資料列插入使用者資料表之交易的 BSN。 |
__sysRK |
varbinary(8000) |
資料列索引鍵。此索引鍵是使用者資料表的主索引鍵或是使用者資料表中已套用 ROWGUIDCOL 屬性之 uniqueidentifier 資料類型的資料行 (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。
LBSN:上次同步認可序號,亦即上次成功同步的 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 為基礎。 |
用於變更追蹤的主要類別。它會提供一些方法,可讓您用來設定、啟用和停用 SQL Server Compact 資料庫中資料表的變更追蹤。此外,它也會提供一些方法,以便從標記資料表和交易認可順序資料表中清除追蹤資料,以及升級 SQL Server Compact 3.5 SP2 資料庫,以供 Microsoft Sync Framework 1.0 SP1 和 Sync Framework 的更新版本使用。 |
|
加入了兩個新屬性。CurrentTransactionBsn 屬性會傳回 SQL Server Compact 指派給交易的 BSN。TrackingContext 屬性是用來保存應用程式特有的資訊。這項資訊可以由開發人員定義。當啟用追蹤的使用者資料表被修改時,已修改資料列中的 __sysTrackingContext 資料行就會設定為 TrackingContext 屬性的值。 |
|
包含一些值,這些值會指定要用來向變更追蹤基礎結構唯一識別使用者資料表中資料列的索引鍵類型。此索引鍵可以是針對資料表所定義的主索引鍵或是已套用 ROWGUIDCOL 屬性之 uniqueidentifier 類型的資料行。 |
|
包含一些值,這些值會指定要在使用者資料表上追蹤的作業類型。您可以在資料表上追蹤插入、更新、刪除或其中任何作業的組合。 |