❶ 如何使用 sql Server 變更跟蹤
如果伺服器正在運行 SQL Server 2008,則建議您使用 SQL Server 變更跟蹤。如果伺服器運行的是其他資料庫,請參見如何使用自定義變更跟蹤系統。SQL Server 變更跟蹤概述本文檔中的許多示例都使用一組添加到基表中的列和觸發器來處理變更跟蹤,使用其他表來跟蹤刪除操作。有關更多信息,請參見跟蹤伺服器資料庫中的變更。這種類型的跟蹤對於非 SQL Server 2008 資料庫非常有用。但是,它還是具有以下缺點:在伺服器資料庫中要求架構變更。架構變更可能會影響虛蠢虛其他應用程序,或者可能根本無法實現。對一行中執行的每個變更都會激發觸發器。這會影響性能。用於維護正確的行版本和刪除的邏輯將變得復雜。如果某一伺服器資料庫具有長時間運行的事務,則除非這些事務得到正確處理,否則,在同步期間可能會失去數據變更。這可能導致數據不一致。 SQL Server 變更跟蹤可解決這些問題,並提供一種簡明的方法來跟蹤變更。當對某一表啟用了變更跟蹤時,SQL Server 資料庫引擎 將維護有關對表所做變更的信息。然後,應用程序使用相應變更跟蹤函數來確定哪些行發生了變更並獲取有關這些變更的信息。SQL Server 變更跟蹤的主要優點差燃如下:對於使用 Sync Services 的離線同步方案,您不必創建觸發器、時間戳列、其他附加列或附加表。在提交時跟蹤變更,而不是在發生 DML 操作時跟蹤。函數將返回對表所做的增量變更和版本信息。即使檔櫻存在重疊和未提交的事務,這些函數也能提供可靠且易於使用的結果。對性能的影響非常小。可以自動清除變更跟蹤數據。本主題的其餘部分將演示如何在 Sync Services for ADO.NET 應用程序中使用 SQL Server 變更跟蹤。有關變更跟蹤的更多信息,請參見 SQL Server 2008 聯機叢書。將SQL Server 變更跟蹤與 Sync Services for ADO.NET 一起使用本節介紹如何啟用變更跟蹤,以及如何使用變更跟蹤查詢來確定要下載到客戶端的數據變更。本節中的信息介紹如何使用手動創建的命令選擇來自伺服器的變更。有關如何使用同步適配器生成器為您創建命令的信息,請參見入門:客戶端與伺服器同步。啟用SQL Server 變更跟蹤對伺服器資料庫啟用變更跟蹤,然後對每個需要跟蹤的表啟用變更跟蹤。下面的代碼示例演示一個 Sync Services 示例資料庫中的 Sales.Customer 表的架構以及為該表啟用變更跟蹤所需的代碼。每個表都必須有一個主鍵。主鍵在所有節點上必須是唯一的,而且不得重復使用:即使刪除了某一行,也不得將該行的主鍵用於其他行。對於分布式環境,標識列通常不是適宜的選擇。有關主鍵的更多信息,請參見為分布式環境選擇適宜的主鍵 (Sync Services)。通過運行以下代碼指定的變更跟蹤選項包括保留跟蹤元數據的時間以及是否自動清除這些元數據。有關跟蹤選項的更多信息,請參見 SQL Server 2008 聯機叢書中的「變更跟蹤」、「ALTER DATABASE」和「ALTER TABLE」主題。 CREATE TABLE SyncSamplesDb_ChangeTracking.Sales.Customer( CustomerId uniqueidentifier NOT NULL PRIMARY KEY DEFAULT NEWID(), CustomerName nvarchar(100) NOT NULL, SalesPerson nvarchar(100) NOT NULL, CustomerType nvarchar(100) NOT NULL) ALTER DATABASE SyncSamplesDb_ChangeTracking SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE SyncSamplesDb_ChangeTracking SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON) ALTER TABLE SyncSamplesDb_ChangeTracking.Sales.Customer ENABLE CHANGE_TRACKING 注意強烈建議您在查詢變更信息時使用快照事務。這有助於確保變更信息的一致性並避免出現與後台清除任務相關的爭用情況。有關快照隔離的更多信息,請參見 SQL Server 2008 聯機叢書中的「資料庫引擎中的隔離級別」。確定要下載到客戶端的數據變更啟用變更跟蹤後,Sync Services 應用程序使用變更跟蹤函數和「定位點」來確定要下載的插入、更新和刪除。定位點僅僅是用來定義一組要同步的變更的一個時間點。請考慮以下查詢:為 屬性指定的查詢。以下查詢從伺服器上的 Sales.Customer 表選擇要應用於客戶端的增量插入: IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION <= @sync_new_received_anchor) END 如果這是某個客戶端的第一個同步會話 (@sync_initialized = 0),則會從 Sales.Customer 基表直接選擇架構和所有行。在以後的同步期間,通過執行基表與其變更跟蹤表的內部聯接來選擇新插入的行。變更跟蹤表中的元數據由 CHANGETABLE() 函數公開。該函數將基表名稱和前一同步操作所存儲的變更跟蹤版本作為參數。SYS_CHANGE_OPERATION 列定義存儲在變更跟蹤錶行中的變更的類型。注意查詢還應檢查所需的所有變更是否都已從跟蹤表中清除。有關示例,請參見本主題後面的「指定一條從伺服器上選擇要應用於客戶端的增量插入的命令」。為SelectNewAnchorCommand 屬性指定的查詢。此查詢檢索一個時間點值。以下查詢通過使用 change_tracking_current_version() 函數從伺服器中檢索新的定位點值。這一內置的 SQL Server 函數返回一個版本整數,它與通過變更跟蹤進行跟蹤的上次提交的事務相關聯。 SELECT @sync_new_received_anchor = change_tracking_current_version() 該整數值存儲在客戶端資料庫中,並且由同步變更的命令使用。在每次同步會話期間,將使用新的定位點值以及來自先前同步會話的上一個定位點值:這意味著將對在這兩個作為上下限的定位點值之間做出的變更集進行同步。在某些情況下,應用程序只要求每個客戶端上的一部分數據。可以在 WHERE 子句中包括附加的條件,以便篩選數據。有關更多信息,請參見如何篩選行和列。「基於非鍵列的篩選器」一節中包括與使用 SQL Server 變更跟蹤進行篩選有關的重要信息。在同步過程中執行的查詢如果是首次同步 Sales.Customer 表,則會執行以下過程:執行新的定位點命令。該命令返回一個整數值,如 372。此值存儲在客戶端資料庫中。該表從未進行過同步。因此,客戶端資料庫中原本沒有存儲任何從先前同步操作所得到的定位點值。在這種情況下,Sync Services 使用值 0。Sync Services 執行的查詢如下所示: exec sp_executesql N'IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = ''I'' AND CT.SYS_CHANGE_CREATION_VERSION <= @sync_new_received_anchor) END', N'@sync_initialized int, @sync_last_received_anchor bigint, @sync_new_received_anchor bigint', @sync_initialized=0, @sync_last_received_anchor=0, @sync_new_received_anchor=372 在第二次同步會話期間,執行新的定位點命令。自上一會話以來已經插入了一些行。因此,該命令返回值 375。該表以前已進行過同步。因此,Sync Services 可檢索先前同步操作所得到的客戶端資料庫中存儲的 372 的定位點值。執行的查詢如下所示。該查詢只從表中下載在兩個定位點值之間插入的行。 exec sp_executesql N'IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = ''I'' AND CT.SYS_CHANGE_CREATION_VERSION <= @sync_new_received_anchor) END', N'@sync_initialized int, @sync_last_received_anchor bigint, @sync_new_received_anchor bigint', @sync_initialized=1, @sync_last_received_anchor=372, @sync_new_received_anchor=375 有關更新和刪除命令的示例,請參見本主題後面的完整代碼示例。標識執行數據變更的客戶端之所以要標識執行數據變更的客戶端,主要有兩個原因:在僅進行上載的同步和雙向同步中為沖突檢測和沖突解決提供支持。如果伺服器和某個客戶端(或多個客戶端)可以變更某個給定行,您可能希望標識出變更的執行者。此信息有助於您編寫代碼,例如,編寫確定哪一個變更具有更高的優先順序的代碼。如果沒有此信息,將保留對該行的最近一次變更。在雙向同步期間,防止將變更回送給客戶端。 Sync Services 首先將變更上載到伺服器,然後將變更下載到客戶端。如果不跟蹤執行變更的客戶端的標識,該變更將上載到伺服器,然後在同一個同步會話中下載回到該客戶端。某些情況下,回送變更是必需的,但是在另一些情況下並非如此。變更跟蹤提供一個機制,可以將應用程序數據與變更行時的變更信息一起存儲。這些應用程序數據可用於標識正在進行變更的客戶端。然後,在您查詢變更時可返回進行了變更的客戶端的這一標識。SYS_CHANGE_CONTEXT 列可與 ClientId 屬性一起使用,以確定每個插入、更新或刪除操作是由哪個客戶端執行的。在任何錶使用除快照同步以外的方法進行第一次同步時,Sync Services 會在客戶端上存儲一個 GUID 值以標識該客戶端。然後將此 ID 傳遞給 DbServerSyncProvider,以便能夠由每個 SyncAdapter 對象的命令使用。可以通過 ClientId 屬性以及 @sync_client_id 和@sync_client_id_binary 會話變數獲得該 ID 值。請考慮以下 Transact-SQL 查詢: IF @sync_initialized = 0 SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer LEFT OUTER JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary) ELSE BEGIN SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT ON CT.[CustomerId] = Sales.Customer.[CustomerId] WHERE (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION <= @sync_new_received_anchor AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary)); 此查詢類似於前面用來跟蹤在伺服器上所做插入操作的查詢。每個 WHERE 子句中的附加語句可確保只下載那些不是由當前進行同步的客戶端所做的插入。Sync Services 還允許應用程序通過在伺服器上使用一個整數而不是 GUID 值來標識客戶端。有關更多信息,請參見如何使用會話變數。若要跟蹤哪一客戶端進行了在伺服器上應用的數據變更,請使用 WITH CHANGE_TRACKING_CONTEXT 子句。在執行 INSERT、UPDATE 或 DELETE 語句前,將 CHANGE_TRACKING_CONTEXT 設置為 @sync_client_id 或@sync_client_id_binary 會話變數的值。此信息存儲在變更跟蹤表中,以便應用程序可以跟蹤變更所處的上下文。對於 Sync Services 來說,這通常是客戶端 ID;但是,您可以存儲適合 varbinary(128) 列的任何值。 WITH CHANGE_TRACKING_CONTEXT (@sync_client_id_binary) INSERT INTO Sales.Customer (CustomerId, CustomerName, SalesPerson, CustomerType) VALUES (@CustomerId, @CustomerName, @SalesPerson, @CustomerType) SET @sync_row_count = @@rowcount 了解和運行示例應用程序本節包含配置和執行同步所需的應用程序代碼。只通過閱讀示例代碼,就可以學習到很多相關知識。但是,運行示例並查看其運行情況則更加直觀。在運行代碼前,請確保安裝了以下產品: Sync Services 該應用程序需要參考 Microsoft.Synchronization.Data.dll、Microsoft.Synchronization.dll、Microsoft.Synchronization.Data.Server.dll 和 Microsoft.Synchronization.Data.SqlServerCe.dll。 SQL Server 2008 示例代碼在連接字元串中使用 localhost。若要使用遠程伺服器,請將 localhost 變更為適當的伺服器名稱。Sync Services 示例資料庫。有關更多信息,請參見用於Sync Services 幫助主題的安裝腳本。如果您曾經閱讀過用於客戶端與伺服器同步的體系結構和類主題,應該已經對該應用程序中使用的主要類有所了解。該應用程序由以下類組成:SampleSyncAgent此類派生自 SyncAgent。SampleServerSyncProvider。此類派生自 DbServerSyncProvider 並包含 SyncAdapter 和一組查詢變更跟蹤表的命令。SampleClientSyncProvider此類派生自 SqlCeClientSyncProvider 並包含 SyncTable。SampleStats此類使用 SyncAgent 返回的統計信息。Program。此類設置同步並調用 Utility 類的方法。Utility. 此類負責處理所有不與同步直接相關的功能,例如保存連接字元串信息以及更改伺服器和客戶端資料庫等。有關更多信息,請參見 用於Sync Services 幫助主題的 Utility 類。API 的要點在您查看完整代碼示例之前,建議您首先查看以下示例。這些示例闡釋在本應用程序中使用的 API 的若干要點。所演示的所有示例代碼都包含在 SampleServerSyncProvider 類中。除了在本節中演示的命令外,該完整代碼示例還包含可將插入應用於伺服器的命令以及選擇和應用刪除的命令。第一個示例直接應用於 DbServerSyncProvider 屬性SelectNewAnchorCommand。其他示例應用於 Sales.Customer 表的SyncAdapter 對象。從伺服器中檢索新的定位點值以下代碼示例指定從伺服器中檢索新定位點值的命令。SyncSession 類包含幾個可在同步命令中使用的字元串常量。SyncNewReceivedAnchor 是這些常量之一。此外,還可以在查詢中直接使用 @sync_new_received_anchor 文本。C#VB SqlCommand selectNewAnchorCommand = new SqlCommand(); string newAnchorVariable = "@" + SyncSession.SyncNewReceivedAnchor; selectNewAnchorCommand.CommandText = "SELECT " + newAnchorVariable + " = change_tracking_current_version()"; selectNewAnchorCommand.Parameters.Add(newAnchorVariable, SqlDbType.BigInt); selectNewAnchorCommand.Parameters[newAnchorVariable].Direction = ParameterDirection.Output; selectNewAnchorCommand.Connection = serverConn; this.SelectNewAnchorCommand = selectNewAnchorCommand; 指定一條從伺服器上選擇要應用於客戶端的增量插入的命令下面的代碼示例指定一條從伺服器上選擇要應用於客戶端的增量插入的命令。用於增量變更的所有查詢都將檢查所需的變更是否已從變更跟蹤表中清除。此檢查從以下子句開始,並且在已清除變更後將引發錯誤:IF CHANGE_TRACKING_MIN_VALID_VERSION (object_id (@sync_table_name)) > @sync_last_received_anchorC#VB SqlCommand customerIncrInserts = new SqlCommand(); customerIncrInserts.CommandText = "IF @sync_initialized = 0 " + "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] " + "FROM Sales.Customer LEFT OUTER JOIN " + "CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary) " + "ELSE " + "BEGIN " + "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] " + "FROM Sales.Customer JOIN CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (CT.SYS_CHANGE_OPERATION = 'I' AND CT.SYS_CHANGE_CREATION_VERSION " + "<= @sync_new_received_anchor " + "AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary)); " + "IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(@sync_table_name)) " + "> @sync_last_received_anchor " + "RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. " + "To recover from this error, the client must reinitialize its local database and try again' " + ",16,3,@sync_table_name) " + "END"; customerIncrInserts.Parameters.Add("@" + SyncSession.SyncInitialized, SqlDbType.Int); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt); customerIncrInserts.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar); customerIncrInserts.Connection = serverConn; customerSyncAdapter. = customerIncrInserts; 指定一條從伺服器上選擇要應用於客戶端的增量更新的命令下面的代碼示例指定一條從伺服器上選擇要應用於客戶端的增量更新的命令。C#VB SqlCommand customerIncrUpdates = new SqlCommand(); customerIncrUpdates.CommandText = "IF @sync_initialized > 0 " + "BEGIN " + "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType] " + "FROM Sales.Customer JOIN " + "CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (CT.SYS_CHANGE_OPERATION = 'U' AND CT.SYS_CHANGE_VERSION " + "<= @sync_new_received_anchor " + "AND (CT.SYS_CHANGE_CONTEXT IS NULL OR CT.SYS_CHANGE_CONTEXT <> @sync_client_id_binary)); " + "IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(@sync_table_name)) " + "> @sync_last_received_anchor " + "RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. " + "To recover from this error, the client must reinitialize its local database and try again'" + ",16,3,@sync_table_name) " + "END"; customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncInitialized, SqlDbType.Int); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary); customerIncrUpdates.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar); customerIncrUpdates.Connection = serverConn; customerSyncAdapter. = customerIncrUpdates; 指定一條將增量更新從客戶端應用於伺服器的命令在以下代碼示例中,UPDATE 語句更新基表,並返回受影響的行的計數。如果行計數為 0,則表示發生了錯誤或沖突。有關更多信息,請參見如何處理數據沖突和錯誤。C#VB SqlCommand customerUpdates = new SqlCommand(); customerUpdates.CommandText = ";WITH CHANGE_TRACKING_CONTEXT (@sync_client_id_binary) " + "UPDATE Sales.Customer " + "SET [CustomerName] = @CustomerName, [SalesPerson] = @SalesPerson, [CustomerType] = @CustomerType " + "FROM Sales.Customer " + "JOIN CHANGETABLE(VERSION Sales.Customer, ([CustomerId]), (@CustomerId)) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId] " + "WHERE (@sync_force_write = 1 " + "OR CT.SYS_CHANGE_VERSION IS NULL OR CT.SYS_CHANGE_VERSION <= @sync_last_received_anchor " + "OR (CT.SYS_CHANGE_CONTEXT IS NOT NULL AND CT.SYS_CHANGE_CONTEXT = @sync_client_id_binary)) " + "SET @sync_row_count = @@rowcount; " + "IF CHANGE_TRACKING_MIN_VALID_VERSION(object_id(@sync_table_name)) > @sync_last_received_anchor " + "RAISERROR (N'SQL Server Change Tracking has cleaned up tracking information for table ''%s''. " + "To recover from this error, the client must reinitialize its local database and try again'" + ",16,3,@sync_table_name)"; customerUpdates.Parameters.Add("@" + SyncSession.SyncClientIdBinary, SqlDbType.Binary); customerUpdates.Parameters.Add("@CustomerName", SqlDbType.NVarChar); customerUpdates.Parameters.Add("@SalesPerson", SqlDbType.NVarChar); customerUpdates.Parameters.Add("@CustomerType", SqlDbType.NVarChar); customerUpdates.Parameters.Add("@CustomerId", SqlDbType.UniqueIdentifier); customerUpdates.Parameters.Add("@" + SyncSession.SyncForceWrite, SqlDbType.Bit); customerUpdates.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerUpdates.Parameters.Add("@" + SyncSession.SyncRowCount, SqlDbType.Int); customerUpdates.Parameters["@" + SyncSession.SyncRowCount].Direction = ParameterDirection.Output; customerUpdates.Parameters.Add("@" + SyncSession.SyncTableName, SqlDbType.NVarChar); customerUpdates.Connection = serverConn; customerSyncAdapter.UpdateCommand = customerUpdates; 選擇沖突行下面的命令從伺服器資料庫中選擇沖突行(如果這些行仍存在於基表中)。C#VB SqlCommand customerUpdateConflicts = new SqlCommand(); customerUpdateConflicts.CommandText = "SELECT Sales.Customer.[CustomerId], [CustomerName], [SalesPerson], [CustomerType], " + "CT.SYS_CHANGE_CONTEXT, CT.SYS_CHANGE_VERSION " + "FROM Sales.Customer JOIN CHANGETABLE(VERSION Sales.Customer, ([CustomerId]), (@CustomerId)) CT " + "ON CT.[CustomerId] = Sales.Customer.[CustomerId]"; customerUpdateConflicts.Parameters.Add("@CustomerId", SqlDbType.UniqueIdentifier); customerUpdateConflicts.Connection = serverConn; customerSyncAdapter. = customerUpdateConflicts; 下面的命令從伺服器資料庫中選擇沖突行(如果這些行已從基表中刪除)。C#VB SqlCommand customerDeleteConflicts = new SqlCommand(); customerDeleteConflicts.CommandText = "SELECT CT.[CustomerId], " + "CT.SYS_CHANGE_CONTEXT, CT.SYS_CHANGE_VERSION " + "FROM CHANGETABLE(CHANGES Sales.Customer, @sync_last_received_anchor) CT " + "WHERE (CT.[CustomerId] = @CustomerId AND CT.SYS_CHANGE_OPERATION = 'D')"; customerDeleteConflicts.Parameters.Add("@" + SyncSession.SyncLastReceivedAnchor, SqlDbType.BigInt); customerDeleteConflicts.Parameters.Add("@CustomerId", SqlDbType.UniqueIdentifier); customerDeleteConflicts.Connection = serverConn; customerSyncAdapter. = customerDeleteConflicts; 有關如何處理數據沖突的更多信息,請參見如何處理數據沖突和錯誤。完整的代碼示例下面的完整代碼示例包括了上面介紹的代碼示例以及用於執行同步的其他代碼。C#VBusing System; using System.IO; using System.Text; using System.Data; using System.Data.SqlC
❷ SQL中的ReportServer資料庫是什麼資料庫
一、Report Server資料庫:
是一個SQL Server資料庫。它能夠存儲SSRS配置部分,報告定義,報告元數據,報告歷史,緩存政策,快照,資源,安全設置,加密的數據,調度和提交數據,以及擴展信息。
注意事項:盡管用戶能夠直接存取在SSRS目錄下的資料庫並且能夠直接修改SSRS使用的對象;但在實踐中,不推薦(或不支持)這樣做,因為在SSRS目錄下的內在數據和結構不能被保證與不同版本的SSRS、服務包或補丁相兼容。
需要把Report Server資料庫當作產品資料庫之一來對待。盡管許多開發人員都習慣把RDL存儲在一個單獨的倉庫中,並因此導致經常恢復RDL。但是,損失快照數據能夠帶來消極的業務影響。
例如,用戶可能使用快照的報告"相對靜止"數據的能力來作一些業務決定。
二、ReportServerTempDB資料庫:
是SSRS使用的臨時資料庫。這個資料庫負責存儲中間處理結果,例如報表伺服器生成的會話和執行數據、緩存報表以及工作表。
正常情況下,Report Server能夠周期性地清ReportServerTempDB中的到期的和孤立的數據。後台進程定期清理時間間隔由參數CleanupCycleMinutes控制,這個參數位於
<Installation Drive><Program Files or Program Files(x86)>Microsoft SQL Server<SSRS Instance>Reporting ServicesReportServer 下的rsreportserver.config配置文件中。
注意事項:為了把臨時快照存儲在文件系統而不是資料庫中,管理員應該完成下列步驟。
1、修改RSReportServer.config,並把WebServiceUseFileShareStorage和設置為True。
2、把FileShareStorageLocation設置為一個全稱路徑。默認路徑是"C:Program FilesMicrosoft SQL ServerMSSQL.3Reporting ServicesRSTempFiles"。
不同於SQL Server的tempdb,當在ReportServerTempDB中的數據存儲時限超過SQL Server時,Report Server將會重啟。
而且,Report Server能夠周期性地清除ReportServerTempDB中的到期的和孤立的數據。 在任何時間,所有的ReportServerTempDB中的數據都能夠被以最小(或毫無)影響刪除掉。
如果磁碟空間足夠的情況下,就不要收縮ReportServerTempDB資料庫了。如果磁碟空間實在緊張,那麼收縮也是必須的。
如果還存在dbo.SessionData不斷增長的情況,最好創建做一個作業,每天定期清理那些過期的會話信息。