當前位置:首頁 » 編程語言 » sql更改跟蹤
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql更改跟蹤

發布時間: 2023-06-04 13:37:53

㈠ 如何使用sqlserver 2012 Always on技術

一、啟用FileTable1、修改資料庫引擎的屬性打開「SQLServer配置管理器」,修改SQLServer資料庫引擎的屬性。使用此頁可針對此MicrosoftSQLServer2012安裝啟用FILESTREAM。(1)針對Transact-SQL訪問啟用FILESTREAM選中此項可針對Transact-SQL訪問啟用FILESTREAM。必須選中此控制選項,才能使用其他控制選項。如果不啟用此選項,就不能添加FileStream文件組。(2)針對文件I/O流訪問啟用FILESTREAM選中此項可針對FILESTREAM啟用Win32流訪問。(3)Windows共享名使用此控制選項可輸入將用來存儲FILESTREAM數據的Windows共享的名稱。默認為該SQLServer實例的名稱。(4)允許遠程客戶端針對FILESTREAM數據啟用流訪問選中此控制選項可允許遠程客戶端訪問此伺服器上的此FILESTREAM數據。2、修改伺服器的屬性打開「SQLServerManagementStudio」,修改該實例的配置。默認配置如下:上述選項解釋如下:(1)「FILESTREAM訪問級別」顯示SQLServer實例上支持的FILESTREAM的當前級別。若要更改訪問級別,請選擇以下值之一:已禁用無法將二進制大型對象(BLOB)數據存儲在文件系統中。此為默認值。即filestreamaccesslevel=0已啟用Transact-SQL訪問可使用Transact-SQL訪問FILESTREAM數據,但不能通過文件系統進行訪問。即filestreamaccesslevel=1已啟用完全訪問FILESTREAM數據可使用Transact-SQL以及通過文件系統進行訪問。即filestreamaccesslevel=0注意:在首次啟用FILESTREAM時,您可能需要重新啟動計算機才能配置驅動程序。(2)「FILESTREAM共享名稱」顯示在安裝過程中選擇的FILESTREAM共享的只讀名稱。在本次實驗中,我們將「FILESTREAM訪問級別」設定為:已啟用完全訪問。如果是通過T-SQL腳本執行,則運行以下腳本:EXECsys.sp_configureN'filestreamaccesslevel',N'2'RECONFIGUREWITHOVERRIDE注意:設置完成之後,重啟實例。3、配置防火牆若要在防火牆保護的環境中使用FILESTREAM,客戶端和伺服器都必須能夠將DNS名稱解析為包含FILESTREAM文件的伺服器。FILESTREAM要求Windows文件共享埠139和445處於打開狀態。二、配置文件組1、添加文件組完成上述操作之後,就可以為該資料庫添加專用於FileStream的文件組。如果是通過腳本操作,請運行以下腳本:ALTERDATABASE[db01]ADDFILEGROUP[FileStreamFileGroup]CONTAINSFILESTREAM2、添加文件完成上述操作之後,就可以為該資料庫添加FilStream類型的資料庫文件。在本例中,系統並沒有為「FileStream數據」的文件類型創建mdf或ndf文件,而是在文件夾C:\SqlData下面自動創建以邏輯名稱命名的文件夾,即C:\SqlData\FileData。其中filestream.hdr文件是FILESTREAM容器的頭文件。當這個資料庫被刪除時,mdf、ndf、log連同這個文件夾都會被刪除。如果是通過腳本操作,請運行以下腳本:ALTERDATABASE[db01]ADDFILE(NAME=N'FileData',FILENAME=N'C:\SqlData\FileData')TOFILEGROUP[FileStreamFileGroup]注意:在上例中,在運行腳本之前,必須存在C:\SqlData,建議使用右側的選擇按鈕選擇路徑。如果路徑不存在,就會報錯:同時不能存在重復的文件夾,即不能存在C:\SqlData\FileData。否則也會報錯:3、啟動非事務訪問FileTable使Windows應用程序可以獲取FILESTREAM數據的Windows文件句柄而不需要SQLServer事務。為了允許對SQLServer中存儲的文件進行此非事務性訪問,必須為要包含FileTable的每個資料庫在資料庫級別上指定所需的非事務性訪問級別。選項解釋如下:(1)FILESTREAM非事務訪問為從文件系統到FileTables中存儲的FILESTREAM數據的非事務性訪問指定以下選項之一:OFF、READ_ONLY或FULL。如果在伺服器上未啟用FILESTREAM,則該值將設置為OFF並且被禁用。在本次實驗中,將其設置為FULL。(2)FILESTREAM目錄名稱為與所選資料庫相關聯的FILESTREAM數據指定目錄名稱。在FileTable文件夾層次結構中,此資料庫級目錄將成為在實例級別為FILESTREAM指定的共享名稱的子級以及在資料庫中創建的FileTable的父級。如果啟用非事務性訪問時沒有提供目錄名稱,則在以後必須提供它,這樣才能在資料庫中創建FileTable。如果是通過腳本執行,如下:(NON_TRANSACTED_ACCESS=FULL,DIRECTORY_NAME=N'ImageFiles')注意:更改現有資料庫時,調用帶DIRECTORY_NAMEFILESTREAM選項的ALTERDATABASE(Transact-SQL)語句。使用這些選項更改目錄名稱時,資料庫必須以獨占方式鎖定,沒有打開的文件句柄。說明:為檢查是否在資料庫上啟用了非事務性訪問,可以查詢目錄視圖,腳本如下:SELECTDB_NAME(database_id),non_transacted_access,non_transacted_access_descFROMsys.database_filestream_options三、創建FileTable1、創建第一個FileTable「SQLServerManagementStudio」只提供一個腳本模板,要想創建FileTable還是得用腳本完成:官方的範本為:USE[db01]CREATETABLE[dbo].[ImageTable1]ASFILETABLEON[PRIMARY]FILESTREAM_ON[FileStreamFileGroup]WITH(FILETABLE_DIRECTORY=N'ImageTable1',FILETABLE_COLLATE_FILENAME=Chinese_PRC_CI_AS)2、創建第二個、獲取共享路徑文件表創建之後,就會相應的產生一個文件表共享目錄,該目錄路徑可以通過內建函數獲取:SELECTFileTableRootPath('ImageTable1')本次實驗所返回的結果為:\\SQL1\SqlFile\ImageFiles\ImageTable14、查看通過Windows資源管理器,可見已經創建了以GUID命名的文件夾。通過SQLServerManagementStudio,查看錶的結構。四、操作1、向文件夾中添加文件通過「Windows資源管理器」,向文件夾\\SQL1\SqlFile\ImageFiles\ImageTable1中添加一個文件A01.GIF。然後運行腳本:select*fromImageTable1結果如下:可見,SQLServer自動在Table中添加了記錄。2、文件改名運行以下腳本:updateImageTable1setname='Cup.GIF'wherename='A01.GIF'通過「Windows資源管理器」,查看文件夾\\SQL1\SqlFile\ImageFiles\ImageTable1,可見文件A01.GIF已經被改名為Cup.GIF。3、查看共享文件夾我們可以繼續復制其他文件,然後通過「Windows資源管理器」,查看文件夾。4、刪除文件可以使用腳本刪除,例如:DeleteImageTable1wherename='Cup.GIF'或者,通過「Windows資源管理器」直接刪除該文件。五、備份和還原1、備份資料庫使用SQLServer備份資料庫時,FILESTREAM數據將與資料庫中的結構化數據一起備份。2、部分備份如果不想將FILESTREAM數據與關系數據一起備份,則可以使用部分備份將FILESTREAM文件組排除在外。六、相關說明詳見/zh-cn/library/gg492086.aspx1、AlwaysOn在包含FILESTREAM或FileTable數據的資料庫屬於某一AlwaysOn可用性組時:FILESTREAM和FileTable函數接受或返回虛擬網路名稱(VNN),而非計算機名稱。有關這些函數的詳細信息,請參閱Filestream和FileTable函數(Transact-SQL)。通過文件系統API對FILESTREAM或FileTable數據進行的所有訪問都應該使用VNN,而非計算機名稱。2、表分區FileTable不支持分區。通過對多個FILESTREAM文件組的支持,在大多數方案中可以解決純向上擴展問題,而不必使用分區(不像SQL2008FILESTREAM)。3、復制FileTable不支持復制和相關功能(包括事務性復制、合並復制、更改數據捕獲和更改跟蹤)。4、視圖可以像為任何其他表一樣為FileTable創建視圖。但是對於為FileTable創建的視圖有以下注意事項:視圖將不具有任何FileTable語義,也就是說,視圖中的列(包括「文件屬性」列)的行為與常規視圖列一樣,不具有任何特殊語義,對於表示文件/目錄的行也是如此。可以基於「可更新視圖」語義更新視圖,但是基礎表約束可能拒絕更新,就像在表中一樣。可以通過將文件的路徑添加為視圖中的顯式列,在視圖中顯示該路徑。例如:,column2,…,GetFileNamespacePath()ASPATH,column3,…FROMDocuments

㈡ sql資料庫怎麼跟蹤密碼登錄錯誤的進程

首先禁用伺服器密碼策略
使用sa賬戶登錄SQL server,打開安全性-登錄名-右鍵-輸入登錄名test,選擇SQL server身份驗證,輸入密碼「123」(此時勾選了強制實時密碼策略),點擊確定

可成功創建了test賬戶,並且設置了弱口令「123」,然後右鍵test賬戶看一下屬性。

下圖中顯示test賬戶勾選了強制實施密碼策略,密碼位置:顯示15個圈,是看不出弱口令的。

用弱口令登錄test賬戶也是沒有問題的

然後開啟伺服器密碼策略,使用管理員sa新建一個弱口令賬戶

依然使用sa賬戶登錄SQL server,打開安全性-登錄名-右鍵-輸入登錄名test1,選擇SQL server身份驗證,輸入密碼「123」(此時勾選了強制實施密碼策略),點擊確定

此時資料庫報錯提示「密碼有效性驗證失敗,該密碼不夠復雜,不符合Windows策略要求」,證明了開啟伺服器密碼策略並勾選賬戶強制實施密碼策略,是有效果的。

但我看了一下Windows操作系統的密碼策略也是挺下飯-..-最少六個字元長!!

就是說即使開了密碼策略,還可以將密碼設置為Qwe!23的六位數

如果想要設置密碼最小長度的話,在伺服器密碼策略上修改就可以了

最後試一下開啟Windows操作系統密碼策略,不勾選資料庫賬戶的強制實施密碼策略,看看能不能,設置弱口令

果然結果是可以的。

總結一下就是SQL server密碼策略要同時滿足開啟Windows密碼策略並且勾選SQL server賬戶的強制實施密碼策略才算是符合,但即使這樣的話一樣可以設置6位長度的口令,所以還要設置伺服器的密碼最小長度值。

㈢ oracle跟蹤表結構,查看哪些表被更新的SQL

我首先想到的是觸發器(after類型),不過細琢磨了一下,似乎不那麼靠譜,如果你要關注的表有幾百張,那麼難道建立幾百個出發器么?
可能,僅僅是可能啊,這個不常用,因為比較消耗資源,你試試oracle的審計功能,大概這個能實現你的要求。不過我用審計的次數有限,而且也沒這么大規模的應用過,所以這部分只能你自己查了。

㈣ sql server:如何設置自動執行的存儲過程

--方法1:作業里定時執行存儲過程定時作業的制定 企業管理器 --管理 --SQL Server代理 --右鍵作業 --新建作業 --"常規"項中輸入作業名稱 --"步驟"項 --新建 --"步驟名"中輸入步驟名 --"類型"中選擇"Transact-SQL 腳本(TSQL)" --"資料庫"選擇執行命令的資料庫 --"命令"中輸入要執行的語句: EXEC 存儲過程名 ... --該存儲過程用於創建表 --確定 --"調度"項 --新建調度 --"名稱"中輸入調度名稱 --"調度類型"中選擇你的作業執行安排 --如果選擇"反復出現" --點"更改"來設置你的時間安排 然後將SQL Agent服務啟動,並設置為自動啟動,否則你的作業不會被執行 設置方法: 我的電腦--控制面板--管理工具--服務--右鍵 SQLSERVERAGENT--屬性--啟動類型--選擇"自動啟動"--確定. --方法2:將存儲過程創建在master資料庫中,然後企業管理器中找到這個存儲過程--右鍵--屬性--勾選"每當sql server啟動時執行"。 或在master中創建存儲過程後,執行語句配置為自動啟動 use master exec sp_procoption '存儲過程名','startup','on' 自動執行存儲過程 SQL Server 啟動時能夠自動執行一個或多個存儲過程。這些存儲過程必須由系統管理員創建,並在 sysadmin 固定伺服器角色下作為後台過程執行。這些過程不能有任何輸入參數。 對啟動過程的數目沒有限制,但是要注意,每個啟動過程在執行時都會佔用一個連接。假如必須在啟動時執行多個過程,但無需並行執行,則能夠指定一個過程作為啟動過程,讓該過程調用其他過程。這樣就只佔用一個連接。 在啟動時恢復了最後一個資料庫後,即開始執行存儲過程。若要跳過這些存儲過程的執行,請將啟動參數指定為跟蹤標記 4022。假如以最低配置啟動 SQL Server(使用 -f 標記),則啟動存儲過程也不會執行。有關更多信息,請參見跟蹤標記。 若要創建啟動存儲過程,必須作為 sysadmin 固定伺服器角色的成員登錄,並在 master 資料庫中創建存儲過程。 使用 sp_procoption 能夠: 將現有存儲過程指定為啟動過程。

㈤ 如何使用 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