精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SQL Server 2008新增的變更數(shù)據(jù)捕獲和更改跟蹤

數(shù)據(jù)庫(kù) SQL Server
本文主要介紹SQL Server中記錄數(shù)據(jù)變更的四個(gè)方法:觸發(fā)器、Output子句、SQL Server 2008中新增的變更數(shù)據(jù)捕獲(Change Data Capture 即CDC)功能、同步更改跟蹤。其中后兩個(gè)為SQL Server 2008所新增。

本文主要介紹SQL Server中記錄數(shù)據(jù)變更的四個(gè)方法:觸發(fā)器、Output子句、SQL Server 2008中新增的變更數(shù)據(jù)捕獲(Change Data Capture 即CDC)功能、同步更改跟蹤。其中后兩個(gè)為SQL Server 2008所新增。

一、觸發(fā)器

在SQL Server的早期版本中,如果要記錄某個(gè)表或視圖的Insert/Update/Delete操作,我們可以借助觸發(fā)器(Trigger)(http://msdn.microsoft.com/zh-cn/library/ms189799.aspx), 這在數(shù)據(jù)量較小的情況下往往是有效的方式之一,其中后觸發(fā)器(After Trigger)只能跟蹤表的三個(gè)操作中的任意組合,而前觸發(fā)器(Instead Of trigger)可以處理表和視圖的更新(即使普通的Update View語句在某些列不明確的情況下報(bào)錯(cuò))。我們看兩個(gè)例子:

準(zhǔn)備基礎(chǔ)數(shù)據(jù):

  1. USE testDb2  
  2. GO  
  3. --創(chuàng)建兩個(gè)測(cè)試表  
  4. IF NOT OBJECT_ID('DepartDemo'IS NULL 
  5. DROP TABLE [DepartDemo]  
  6. GO  
  7. IF NOT OBJECT_ID('DepartChangeLogs'IS NULL 
  8. DROP TABLE [DepartChangeLogs]  
  9. GO  
  10. --測(cè)試表  
  11. CREATE TABLE [dbo].[DepartDemo](  
  12. [DID] [int] IDENTITY(101,1) NOT NULL PRIMARY KEY,  
  13. [DName] [nvarchar](200) NULL,  
  14. [DCode] [nvarchar](500) NULL,  
  15. [Manager] [nvarchar](50) NULL,  
  16. [ParentID] [intNOT NULL DEFAULT ((0)),  
  17. [AddUser] [nvarchar](50) NULL,  
  18. [AddTime] [datetime] NULL,  
  19. [ModUser] [nvarchar](50) NULL,  
  20. [ModTime] [datetime] NULL,  
  21. [CurState] [smallintNOT NULL DEFAULT ((0)),  
  22. [Remark] [nvarchar](500) NULL,  
  23. [F1] [intNOT NULL DEFAULT ((0)),  
  24. [F2] [nvarchar](300) NULL 
  25. )  
  26. GO  
  27. --記錄日志表  
  28. CREATE TABLE [DepartChangeLogs]  
  29. ([LogID] [bigint] IDENTITY(1001,1) NOT NULL PRIMARY KEY,  
  30. [DID] [intNOT NULL,  
  31. [DName] [nvarchar](200) NULL,  
  32. [DCode] [nvarchar](500) NULL,  
  33. [Manager] [nvarchar](50) NULL,  
  34. [ParentID] [intNOT NULL DEFAULT ((0)),  
  35. [AddUser] [nvarchar](50) NULL,  
  36. [AddTime] [datetime] NULL,  
  37. [ModUser] [nvarchar](50) NULL,  
  38. [ModTime] [datetime] NULL,  
  39. [CurState] [smallintNOT NULL DEFAULT ((0)),  
  40. [Remark] [nvarchar](500) NULL,  
  41. [F1] [intNOT NULL DEFAULT ((0)),  
  42. [F2] [nvarchar](300) NULL,  
  43. [LogTime] DateTime Default(Getdate()) Not Null,  
  44. [InsOrUpd] char not null 
  45. )  
  46. GO 

創(chuàng)建觸發(fā)器:

  1. /******* 創(chuàng)建一個(gè)After DML觸發(fā)器 ******/  
  2. /********* 3w@live.cn 邀月***************/  
  3. CREATE TRIGGER dbo.tri_LogDepartDemo  
  4. ON [dbo].[DepartDemo]  
  5. AFTER INSERTDelete /************此處使用update與“Insert,Delete”效果是一樣的,邀月注 **********/  
  6. AS 
  7. SET NOCOUNT ON --屏蔽觸發(fā)器發(fā)送“受影響的行數(shù)”給應(yīng)用程序  
  8. -- Inserted rows  
  9. INSERT [DepartChangeLogs]  
  10. (DID,[DName], [DCode], [Manager], [ParentID],  
  11. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2],  
  12. LogTime, InsOrUPD)  
  13. SELECT DISTINCT DID,[DName], [DCode], [Manager], [ParentID],  
  14. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2],  
  15. GETDATE(), 'I' 
  16. FROM inserted i  
  17. -- Deleted rows  
  18. INSERT [DepartChangeLogs]  
  19. (DID,[DName], [DCode], [Manager], [ParentID],  
  20. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2],  
  21. LogTime, InsOrUPD)  
  22. SELECT DISTINCT DID,[DName], [DCode], [Manager], [ParentID],  
  23. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2],  
  24. GETDATE(), 'D' 
  25. FROM deleted d  
  26. GO  
  27. INSERT [dbo].[DepartDemo] ([DName], [DCode], [Manager], [ParentID],  
  28. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2])  
  29. VALUES (N'國(guó)家統(tǒng)計(jì)局房產(chǎn)審計(jì)一科', N'0', N'胡不歸', 0, N'DeomUser',  
  30. CAST(0x00009DF7017B6F96 AS DateTime), N''CAST(0x0000000000000000 AS DateTime),  
  31. 1, N'專業(yè)評(píng)估全國(guó)房?jī)r(jià),為老百姓謀福祉', 0, N'')  
  32. GO  
  33. ----該Update不會(huì)被觸發(fā)器記錄,但Update會(huì)生效  
  34. UPDATE departDemo SET [Manager]='任我行' WHERE DID=101  
  35. GO  
  36. DELETE FROM departDemo where DID=101  
  37. GO  
  38. SELECT * FROM [DepartChangeLogs] 

統(tǒng)計(jì)效果:

邀月工作室 

如果你覺得觸發(fā)器過于浪費(fèi),你可以試著根據(jù)某些字段以縮小觸發(fā)器的范圍

  1. /********* 使用DML觸發(fā)器記錄特定列的修改 ***/  
  2. /********* 3w@live.cn 邀月***************/  
  3. CREATE TRIGGER dbo.[tri_LogDepartDemo2]  
  4. ON [dbo].[DepartDemo]  
  5. AFTER Update 
  6. AS 
  7. IF Update([Manager])  
  8. Begin 
  9. print '該部門主管實(shí)行終身任免制,不得中途更改!' 
  10. Rollback ----回滾Update操作  
  11. End 
  12. GO  
  13. UPDATE departDemo SET [Manager]='任我行' WHERE DID=101  
  14. GO 

執(zhí)行結(jié)果:

邀月工作室 

但觸發(fā)器的缺陷也是顯而易見的,使用觸發(fā)器請(qǐng)注意以下幾點(diǎn):

1、觸發(fā)器通常很隱蔽,換句話說,易忘記,特別在檢查性能和邏輯問題時(shí)。

2、長(zhǎng)時(shí)間運(yùn)行的觸發(fā)器會(huì)嚴(yán)重減慢數(shù)據(jù)操作,特別是在數(shù)據(jù)頻繁修改的數(shù)據(jù)庫(kù)中。

3、不記錄日志的更新不會(huì)引起DML觸發(fā)器的觸發(fā)(如WRITETEXT、Trunacte table及批量插入操作)。

4、約束通常比觸發(fā)器運(yùn)行更快。

5、處理某些邏輯時(shí),存儲(chǔ)過程通常比觸發(fā)器要更易維護(hù)和管理。

6、不允許在觸發(fā)器中使用Select返回結(jié)果集。

關(guān)于觸發(fā)器的更多內(nèi)容,請(qǐng)看MSDN(http://msdn.microsoft.com/zh-cn/library/ms189799.aspx

二、使用Output子句

官方解釋:OutPut子句http://technet.microsoft.com/zh-cn/library/ms177564.aspx)返回受 INSERT、UPDATE、DELETE 或 MERGE 語句影響的各行中的信息,或返回基于受這些語句影響的各行的表達(dá)式。 這些結(jié)果可以返回到處理應(yīng)用程序,以供在確認(rèn)消息、存檔以及其他類似的應(yīng)用程序要求中使用。 也可以將這些結(jié)果插入表或表變量。 另外,您可以捕獲嵌入的 INSERT、UPDATE、DELETE 或 MERGE 語句中 OUTPUT 子句的結(jié)果,然后將這些結(jié)果插入目標(biāo)表或視圖。

舉例:

  1. /********* 使用Output記錄表記錄的修改 *****/  
  2. /********* 3w@live.cn 邀月***************/  
  3. ----刪除前面的觸發(fā)器  
  4. Drop TRIGGER dbo.[tri_LogDepartDemo]  
  5. DROP TRIGGER dbo.[tri_LogDepartDemo2]  
  6. INSERT [dbo].[DepartDemo] ([DName], [DCode], [Manager], [ParentID],  
  7. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2])  
  8. OUTPUT Inserted.*,getdate(),'I' ---注意這行是新增的  
  9. INTO DepartChangeLogs ---注意這行是新增的  
  10. VALUES (N'發(fā)改委', N'0', N'向問天', 0, N'DeomUser',  
  11. CAST(0x00009DF7017B6F96 AS DateTime), N''CAST(0x0000000000000000 AS DateTime),  
  12. 1, N'油價(jià),我說了算', 0, N'')  
  13. GO  
  14. SELECT * FROM [DepartChangeLogs] 

邀月工作室

注意:

1、從OUTPUT 中返回的列反映 INSERT、UPDATE 或 DELETE 語句完成之后但在觸發(fā)器執(zhí)行之前的數(shù)據(jù)。

2、SQL Server 并不保證由使用 OUTPUT 子句的 DML 語句處理和返回行的順序。

3、與觸發(fā)器相比,OutPut子句可以直接處理Merge語句。

以上兩種方法各有千秋,在合適的情況下采取合適的方法才是明智的選擇,令人驚喜的是,SQL Server 2008起,為我們提供了更為強(qiáng)大的內(nèi)建的方法-變更數(shù)據(jù)捕獲(CDC,http://msdn.microsoft.com/zh-cn/library/bb500244%28v=sql.100%29.aspx)和更改跟蹤,下面我們隆重介紹它們。

三、使用“變更數(shù)據(jù)捕獲”(CDC)功能

SQL Server 2008提供了內(nèi)建的方法“”變更數(shù)據(jù)捕獲“”(Change Data Capture 即CDC)以實(shí)現(xiàn)異步跟蹤用戶表的數(shù)據(jù)修改,而且這一功能擁有最小的性能開銷。可以用于其他數(shù)據(jù)源的持續(xù)更新,例如將OLTP數(shù)據(jù)庫(kù)中的數(shù)據(jù)變更遷移到數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)庫(kù)。

要使用CDC功能,首先我們得在數(shù)據(jù)庫(kù)中啟用該功能。在此我們沿用上例中使用的數(shù)據(jù)庫(kù)Testdb2

  1. /**************異步跟蹤數(shù)據(jù)更新演示*************/  
  2. /************* 3w@live.cn 邀月***************/  
  3. use master  
  4. GO  
  5.  
  6. IF EXISTS (SELECT [nameFROM sys.databases WHERE name = 'TestDb2')  
  7. drop DATABASE TestDb2  
  8. Go  
  9. CREATE DATABASE TestDb2  
  10. GO  
  11.  
  12. --查看是否啟用CDC  
  13. SELECT is_cdc_enabled FROM sys.databases WHERE name = 'TestDb2' 
  14.  
  15. USE TestDb2  
  16. GO  
  17. ----啟用當(dāng)前數(shù)據(jù)庫(kù)的CDC功能  
  18. EXEC sys.sp_cdc_enable_db  
  19. GO  
  20.  
  21. /**************  
  22. 如果報(bào)15517錯(cuò)誤,請(qǐng)換用其他owner,邀月注  
  23.  
  24. ******/  
  25.  
  26. SELECT is_cdc_enabled FROM sys.databases WHERE name = 'TestDb2' 
  27.  
  28. /*  
  29. is_cdc_enabled  
  30. 1  
  31. */  
  32. USE testDb2  
  33. GO  
  34.  
  35. CREATE TABLE [dbo].[DepartDemo](  
  36. [DID] [int] IDENTITY(101,1) NOT NULL PRIMARY KEY,  
  37. [DName] [nvarchar](200) NULL,  
  38. [DCode] [nvarchar](500) NULL,  
  39. [Manager] [nvarchar](50) NULL,  
  40. [ParentID] [intNOT NULL DEFAULT ((0)),  
  41. [AddUser] [nvarchar](50) NULL,  
  42. [AddTime] [datetime] NULL,  
  43. [ModUser] [nvarchar](50) NULL,  
  44. [ModTime] [datetime] NULL,  
  45. [CurState] [smallintNOT NULL DEFAULT ((0)),  
  46. [Remark] [nvarchar](500) NULL,  
  47. [F1] [intNOT NULL DEFAULT ((0)),  
  48. [F2] [nvarchar](300) NULL 
  49. )  
  50. GO  
  51.  
  52. /**********************************  
  53. 需要啟用SQL Server Agent服務(wù),否則會(huì)報(bào)錯(cuò),邀月注  
  54. SQLServerAgent is not currently running so it cannot be notified of this action.  
  55. ***********************************/  
  56.  
  57. /****** 捕獲所有的行變更,只返回行的凈變更,其他默認(rèn) *******/  
  58. EXEC sys.sp_cdc_enable_table  
  59. @source_schema = 'dbo',  
  60. @source_name = 'DepartDemo',  
  61. @role_name = NULL,  
  62. @capture_instance = NULL,  
  63. @supports_net_changes = 1,  
  64. @index_name = NULL,  
  65. @captured_column_list = NULL,  
  66. @filegroup_name = default 

注意此時(shí),SQL Server 自啟動(dòng)了兩個(gè)job,一個(gè)捕獲,一個(gè)清除,注意清除是默認(rèn)凌晨2點(diǎn),清除72小時(shí)以上的數(shù)據(jù)。如果同一數(shù)據(jù)庫(kù)的表中CDC已經(jīng)啟用,不會(huì)重建job。

  1. /*  
  2. Job 'cdc.TestDb2_capture' started successfully.  
  3. Job 'cdc.TestDb2_cleanup' started successfully.  
  4. */  
  5.  
  6. --確認(rèn)表已經(jīng)被跟蹤  
  7.  
  8. SELECT is_tracked_by_cdc FROM sys.tables  
  9. WHERE name = 'DepartDemo' and schema_id = SCHEMA_ID('dbo')  
  10. /*  
  11. is_tracked_by_cdc  
  12. 1  
  13. */  
  14.  
  15. --確認(rèn)  
  16. EXEC sys.sp_cdc_help_change_data_capture 'dbo''DepartDemo' 

邀月工作室

增加了一個(gè)表[cdc].[dbo_DepartDemo_CT]

相比源表多了個(gè)字段:

  1. [__$start_lsn]  
  2. ,[__$end_lsn]  
  3. ,[__$seqval]  
  4. ,[__$operation]  
  5. ,[__$update_mask]  

邀月工作室

不建議直接查詢?cè)摫恚鴳?yīng)該使用下面的技巧:

  1. USE TestDb2  
  2. GO  
  3.  
  4. INSERT [dbo].[DepartDemo] ([DName], [DCode], [Manager], [ParentID],  
  5. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2])  
  6. VALUES (N'銀監(jiān)會(huì)', N'0', N'云中鶴', 0, N'DemoUser1',  
  7. CAST(0x00009DF7017B6F96 AS DateTime), N''CAST(0x0000000000000000 AS DateTime),  
  8. 1, N'監(jiān)管匯率', 0, N'')  
  9.  
  10. INSERT [dbo].[DepartDemo] ([DName], [DCode], [Manager], [ParentID],  
  11. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2])  
  12. VALUES (N'統(tǒng)計(jì)局', N'0', N'神算子', 0, N'DemoUser2',  
  13. CAST(0x00009DF7017B6F96 AS DateTime), N''CAST(0x0000000000000000 AS DateTime),  
  14. 1, N'統(tǒng)計(jì)數(shù)據(jù)', 0, N'')  
  15. GO  
  16.  
  17. UPDATE [dbo].[DepartDemo]  
  18. SET Manager='段正淳' 
  19. WHERE DID =101  
  20.  
  21. DELETE [dbo].[DepartDemo]  
  22. WHERE DID = 102 

要查詢變更,我們需要借助大名鼎鼎的日志序列號(hào)(Log Sequence Numbers)即LSN(http://msdn.microsoft.com/zh-cn/library/ms190411%28v=sql.100%29.aspx)來實(shí)現(xiàn)LSN級(jí)別的跟蹤數(shù)據(jù)變更。 下面示例中sys.fn_cdc_map_time_to_lsn(http://msdn.microsoft.com/zh-cn/library/bb500137%28v=sql.100%29.aspx)用于LSN轉(zhuǎn)換為時(shí)間。

  1. /******* 使用LSN 查看CDC記錄 *********/  
  2.  
  3. --http://msdn.microsoft.com/zh-cn/library/bb500137%28v=sql.100%29.aspx  
  4. SELECT sys.fn_cdc_map_time_to_lsn  
  5. 'smallest greater than or equal' , '2012-04-09 16:09:30'as BeginLSN  
  6.  
  7. /*  
  8. BeginLSN  
  9. 0x0000002C000000AA0003  
  10. */  
  11.  
  12. SELECT sys.fn_cdc_map_time_to_lsn  
  13. 'largest less than or equal' , '2012-04-09 23:59:59'as EndLSN  
  14.  
  15. /*  
  16. EndLSN  
  17. 0x0000002C000001C20005  
  18. */  
  19.  
  20. /**************查看所有CDC記錄*************/  
  21. /************* 3w@live.cn 邀月***************/  
  22.  
  23. DECLARE @FromLSN varbinary(10) =  
  24. sys.fn_cdc_map_time_to_lsn  
  25. 'smallest greater than or equal' , '2012-04-09 16:09:30')  
  26.  
  27. DECLARE @ToLSN varbinary(10) =  
  28. sys.fn_cdc_map_time_to_lsn  
  29. 'largest less than or equal' , '2012-04-09 23:59:59')  
  30.  
  31. SELECT 
  32. __$operation,  
  33. __$update_mask,  
  34. DID,  
  35. DName,  
  36. Manager  
  37. FROM [cdc].[fn_cdc_get_all_changes_dbo_DepartDemo]  
  38. (@FromLSN, @ToLSN, 'all')  
  39.  
  40. /************查看所有更新*************************  
  41.  
  42. __$operation __$update_mask DID DName Manager  
  43. 2 0x1FFF 105 銀監(jiān)會(huì) 云中鶴  
  44. 2 0x1FFF 106 統(tǒng)計(jì)局 神算子  
  45. 1 0x1FFF 101 銀監(jiān)會(huì) 段正淳  
  46. 1 0x1FFF 103 銀監(jiān)會(huì) 云中鶴  
  47. 1 0x1FFF 104 統(tǒng)計(jì)局 神算子  
  48. 1 0x1FFF 105 銀監(jiān)會(huì) 云中鶴  
  49. 1 0x1FFF 106 統(tǒng)計(jì)局 神算子  
  50. 2 0x1FFF 107 銀監(jiān)會(huì) 云中鶴  
  51. 2 0x1FFF 108 統(tǒng)計(jì)局 神算子  
  52. 4 0x0008 107 銀監(jiān)會(huì) 段正淳  
  53. 1 0x1FFF 108 統(tǒng)計(jì)局 神算子  
  54. */  
  55.  
  56. /**************查看所有CDC記錄*************/  
  57. /************* 3w@live.cn 邀月***************/  
  58. DECLARE @FromLSN varbinary(10) =  
  59. sys.fn_cdc_map_time_to_lsn  
  60. 'smallest greater than or equal' , '2012-04-09 16:09:30')  
  61.  
  62. DECLARE @ToLSN varbinary(10) =  
  63. sys.fn_cdc_map_time_to_lsn  
  64. 'largest less than or equal' , '2012-04-09 23:59:59')  
  65.  
  66. --解釋一下Operation的具體含義  
  67. SELECT 
  68. CASE __$operation  
  69. WHEN 1 THEN 'DELETE' 
  70. WHEN 2 THEN 'INSERT' 
  71. WHEN 3 THEN 'Before UPDATE' 
  72. WHEN 4 THEN 'After UPDATE' 
  73. END Operation,  
  74. __$update_mask,  
  75. DID,  
  76. DName,  
  77. Manager  
  78. FROM [cdc].[fn_cdc_get_all_changes_dbo_DepartDemo]  
  79. (@FromLSN, @ToLSN, 'all update old'

邀月工作室

  1. /**************查看凈更改(Net changes)CDC記錄*************/  
  2. /************* 3w@live.cn 邀月 ***************/  
  3.  
  4. INSERT [dbo].[DepartDemo] ([DName], [DCode], [Manager], [ParentID],  
  5. [AddUser], [AddTime], [ModUser], [ModTime], [CurState], [Remark], [F1], [F2])  
  6. VALUES (N'藥監(jiān)局', N'0', N'蝶谷醫(yī)仙', 0, N'DemoUser3',  
  7. CAST(0x00009DF7017B6F96 AS DateTime), N''CAST(0x0000000000000000 AS DateTime),  
  8. 1, N'制定藥價(jià)', 0, N'')  
  9. GO  
  10.  
  11. UPDATE [dbo].[DepartDemo]  
  12. SET Manager='胡青牛' 
  13. WHERE DID =109  
  14.  
  15. DECLARE @FromLSN varbinary(10) =  
  16. sys.fn_cdc_map_time_to_lsn  
  17. 'smallest greater than or equal' , '2012-04-09 16:09:30')  
  18.  
  19. DECLARE @ToLSN varbinary(10) =  
  20. sys.fn_cdc_map_time_to_lsn  
  21. 'largest less than or equal' , '2012-04-09 23:59:59')  
  22.  
  23. SELECT 
  24. CASE __$operation  
  25. WHEN 1 THEN 'DELETE' 
  26. WHEN 2 THEN 'INSERT' 
  27. WHEN 3 THEN 'Before UPDATE' 
  28. WHEN 4 THEN 'After UPDATE' 
  29. WHEN 5 THEN 'MERGE' 
  30. END Operation,  
  31. __$update_mask,  
  32. DID,  
  33. DName,  
  34. Manager  
  35. FROM [cdc].[fn_cdc_get_net_changes_dbo_DepartDemo]  
  36. (@FromLSN, @ToLSN, 'all with mask'

邀月工作室

我們還可以通過轉(zhuǎn)換CDC更新掩碼獲得更為直觀的結(jié)果,這里需要借助于另外兩個(gè)函數(shù)sys.fn_cdc_is_bit_set(http://msdn.microsoft.com/zh-cn/library/bb500241%28v=SQL.110%29.aspx)和sys.fn_cdc_get_column_ordinal(http://msdn.microsoft.com/zh-cn/library/bb522549%28v=SQL.100%29.aspx

  1. /************** 轉(zhuǎn)換CDC更新掩碼 *************/  
  2. /************* 3w@live.cn 邀月 **************/  
  3.  
  4. UPDATE dbo.[DepartDemo]  
  5. SET [Manager] = '東方不敗' 
  6. WHERE DID =107  
  7.  
  8. UPDATE dbo.[DepartDemo]  
  9. SET ParentID = 109  
  10. WHERE DID =107  
  11.  
  12. DECLARE @FromLSN varbinary(10) =  
  13. sys.fn_cdc_map_time_to_lsn  
  14. 'smallest greater than or equal' , '2012-04-09 16:09:30')  
  15.  
  16. DECLARE @ToLSN varbinary(10) =  
  17. sys.fn_cdc_map_time_to_lsn  
  18. 'largest less than or equal' , '2012-04-09 23:59:59')  
  19.  
  20. SELECT 
  21. sys.fn_cdc_is_bit_set (  
  22. sys.fn_cdc_get_column_ordinal (  
  23. 'dbo_DepartDemo' , 'Manager' ),  
  24. __$update_mask) Manager_Updated,  
  25. sys.fn_cdc_is_bit_set (  
  26. sys.fn_cdc_get_column_ordinal (  
  27. 'dbo_DepartDemo' , 'ParentID' ),  
  28. __$update_mask) ParentID_Updated,  
  29. DID,  
  30. Manager,  
  31. ParentID  
  32. FROM cdc.fn_cdc_get_all_changes_dbo_DepartDemo  
  33. (@FromLSN, @ToLSN, 'all')  
  34. WHERE __$operation = 4 

邀月工作室

除了前面介紹的指定LSN邊界的方法,SQL Server還提供了一系列的獲取邊界的方法:

sys.fn_cdc_get_max_lsn(http://msdn.microsoft.com/zh-cn/library/bb500304%28v=sql.100%29.aspx)

sys.fn_cdc_get_min_lsn(http://msdn.microsoft.com/zh-cn/library/bb510621%28v=sql.100%29.aspx)

sys.fn_cdc_increment_lsn(http://msdn.microsoft.com/zh-cn/library/bb510745%28v=sql.100%29.aspx)

sys.fn_cdc_decrement_lsn(http://msdn.microsoft.com/zh-cn/library/bb500246%28v=sql.100%29.aspx)

示例如下:

  1. /************** 獲取LSN邊界的其他方法 *************/  
  2. /************* 3w@live.cn 邀月 **************/  
  3.  
  4. --獲取最小邊界  
  5. SELECT sys.fn_cdc_get_min_lsn ('dbo_DepartDemo') Min_LSN  
  6. --獲取可用的最大邊界  
  7. SELECT sys.fn_cdc_get_max_lsn () Max_LSN  
  8. --獲取最大邊界的下一個(gè)序號(hào)  
  9. SELECT sys.fn_cdc_increment_lsn (sys.fn_cdc_get_max_lsn()) New_Lower_Bound_LSN  
  10. --獲取最大邊界的前一個(gè)序號(hào)  
  11. SELECT sys.fn_cdc_decrement_lsn (sys.fn_cdc_get_max_lsn())  
  12. New_Lower_Bound_Minus_one_LSN 

 

 

邀月工作室

通過以下存儲(chǔ)過程在數(shù)據(jù)庫(kù)和表級(jí)禁用CDC

sys.sp_cdc_disable_table (http://msdn.microsoft.com/zh-cn/library/bb510702(v=sql.100).aspx)

sys.sp_cdc_disable_db(http://msdn.microsoft.com/zh-cn/library/bb522508(v=sql.100).aspx)注意,該命令同時(shí)也刪除了CDC架構(gòu)和相關(guān)的SQL代理作業(yè)。

  1. /************** 在數(shù)據(jù)庫(kù)和表級(jí)禁用CDC *************/  
  2. /************* 3w@live.cn 邀月 **************/  
  3.  
  4. EXEC sys.sp_cdc_disable_table 'dbo''DepartDemo''all' 
  5.  
  6. SELECT is_tracked_by_cdc FROM sys.tables  
  7. WHERE name = 'DepartDemo' and schema_id = SCHEMA_ID('dbo')  
  8.  
  9. --當(dāng)前數(shù)據(jù)庫(kù)上禁用CDC  
  10. EXEC sys.sp_cdc_disable_db 

四、使用“更改跟蹤”以最小的磁盤開銷跟蹤凈數(shù)據(jù)更改

CDC 可以用來對(duì)數(shù)據(jù)庫(kù)和數(shù)據(jù)倉(cāng)庫(kù)的持續(xù)數(shù)據(jù)變更進(jìn)行異步數(shù)據(jù)跟蹤,而SQL Server 2008中新增的“更改跟蹤”卻是一個(gè)同步進(jìn)程,是DML操作本身(I/D/U)事務(wù)的一部分,它的最大優(yōu)勢(shì)是以最小的磁盤開銷來偵測(cè)凈行變更,它允許修改的數(shù)據(jù)以事務(wù)一致的形式表現(xiàn),并提供了檢測(cè)數(shù)據(jù)沖突的能力。它甚至可以根據(jù)外部傳入的應(yīng)用程序上下文,來完成更細(xì)顆粒度的更改處理,參看WITH CHANGE_TRACKING_CONTEXT (http://msdn.microsoft.com/zh-cn/library/bb895330%28v=sql.100%29.aspx

  1. /***使用“更改跟蹤”以最小的磁盤開銷跟蹤凈數(shù)據(jù)更改****/  
  2. /************* 3w@live.cn 邀月 **************/  
  3.  
  4. IF EXISTS (SELECT [nameFROM sys.databases WHERE name = 'TestDb4')  
  5. drop DATABASE TestDb4  
  6. Go  
  7. CREATE DATABASE TestDb4  
  8. GO  
  9.  
  10. --啟用更新跟蹤,36小時(shí)清理一次  
  11. ALTER DATABASE TestDb4  
  12. SET CHANGE_TRACKING = ON 
  13. (CHANGE_RETENTION = 36 HOURS,  
  14. AUTO_CLEANUP = ON

注意下一步是允許快照隔離,這是微軟推祟的“最佳實(shí)踐”,盡管這樣行版本的生成會(huì)增加額外的空間使用,從而會(huì)增加總的I/O數(shù)量,但不使用快照會(huì)引發(fā)事務(wù)不一致的變更信息。

  1. ALTER DATABASE TestDb4  
  2. SET ALLOW_SNAPSHOT_ISOLATION ON 
  3. GO  
  4.  
  5. SELECT DB_NAME(database_id) 數(shù)據(jù)庫(kù)名稱,is_auto_cleanup_on,  
  6. retention_period,retention_period_units_desc  
  7. FROM sys.change_tracking_databases  
  8. /*  
  9. 數(shù)據(jù)庫(kù)名稱 is_auto_cleanup_on retention_period retention_period_units_desc  
  10. TestDb4 1 36 HOURS  
  11. */  
  12.  
  13. USE TestDb4  
  14. GO  
  15. --創(chuàng)建測(cè)試表  
  16. CREATE TABLE dbo.DepartDemo  
  17. ([DID] [int] IDENTITY(101,1) NOT NULL PRIMARY KEY,  
  18. [DName] [nvarchar](200) NULL,  
  19. [Manager] [nvarchar](50) NULL,  
  20. [ParentID] [intNOT NULL DEFAULT ((0)),  
  21. [CurState] [smallintNOT NULL DEFAULT ((0)),  
  22. )  
  23. GO  
  24.  
  25. ----TRUNCATE table dbo.DepartDemo  
  26. ----GO  
  27.  
  28. --啟用表的列更新跟蹤  
  29. ALTER TABLE dbo.DepartDemo  
  30. ENABLE CHANGE_TRACKING  
  31. WITH (TRACK_COLUMNS_UPDATED = ON)  
  32.  
  33. --確認(rèn)是否更新跟蹤開啟  
  34. SELECT OBJECT_NAME(object_id) ObjNM,is_track_columns_updated_on  
  35. FROM sys.change_tracking_tables  
  36.  
  37. /*  
  38. ObjNM is_track_columns_updated_on  
  39. DepartDemo 1  
  40. */  
  41.  
  42. --增加測(cè)試數(shù)據(jù)  
  43. INSERT dbo.DepartDemo  
  44. (DName,ParentID)  
  45. VALUES 
  46. ('明教', 0),  
  47. ('五行集', 101),  
  48. ('少林派',0)  
  49.  
  50. SELECT * FROM dbo.DepartDemo  
  51.  
  52. --當(dāng)前版本  
  53. SELECT CHANGE_TRACKING_CURRENT_VERSION ()  
  54. as 當(dāng)前版本  
  55. /*  
  56. 當(dāng)前版本  
  57. 1  
  58. */  
  59. SELECT CHANGE_TRACKING_MIN_VALID_VERSION  
  60. ( OBJECT_ID('dbo.DepartDemo') )as 最小可用版本  
  61.  
  62. /*  
  63. 最小可用版本  
  64. 0  
  65. */ 

函數(shù)ChangeTable有兩種用法來檢測(cè)更改: 一、使用Changes關(guān)鍵字 ;二、使用Version關(guān)鍵字

  1. /*  
  2. 一、使用Changes關(guān)鍵字  
  3. */  
  4.  
  5. SELECT DID,SYS_CHANGE_OPERATION,  
  6. SYS_CHANGE_VERSION  
  7. FROM CHANGETABLE  
  8. (CHANGES dbo.DepartDemo, 0) AS CT 

邀月工作室

  1. UPDATE dbo.DepartDemo  
  2. SET Manager='張無忌' 
  3. WHERE DID = 101  
  4.  
  5. UPDATE dbo.DepartDemo  
  6. SET [DName] = '五行旗' 
  7. WHERE DID = 102  
  8.  
  9. DELETE dbo.DepartDemo  
  10. WHERE DID = 103  
  11.  
  12. SELECT CHANGE_TRACKING_CURRENT_VERSION () as 當(dāng)前版本  
  13. /*  
  14. 當(dāng)前版本  
  15. 4  
  16. */  
  17.  
  18. --版本1之后的更改  
  19. SELECT DID,  
  20. SYS_CHANGE_VERSION,  
  21. SYS_CHANGE_OPERATION,  
  22. SYS_CHANGE_COLUMNS  
  23. FROM CHANGETABLE  
  24. (CHANGES dbo.DepartDemo, 1) AS CT  

邀月工作室

  1. --返回哪些列被修改,1為真,0為假  
  2. SELECT DID,  
  3. CHANGE_TRACKING_IS_COLUMN_IN_MASK(  
  4. COLUMNPROPERTY(  
  5. OBJECT_ID('dbo.DepartDemo'),'DName''ColumnId') ,  
  6. SYS_CHANGE_COLUMNS) 是否改變DName,  
  7. CHANGE_TRACKING_IS_COLUMN_IN_MASK(  
  8. COLUMNPROPERTY(  
  9. OBJECT_ID('dbo.DepartDemo'), 'Manager''ColumnId') ,  
  10. SYS_CHANGE_COLUMNS) 是否改變Manager  
  11. FROM CHANGETABLE  
  12. (CHANGES dbo.DepartDemo, 1) AS CT  
  13. WHERE SYS_CHANGE_OPERATION = 'U' 
  14. /*  
  15. DID 是否改變DName 是否改變Manager  
  16. 101 0 1  
  17. 102 1 0  
  18. */ 
  1. /*  
  2. 二、使用Version關(guān)鍵字  
  3. */  
  4.  
  5. SELECT d.DID, d.DName, d.Manager,  
  6. ct.SYS_CHANGE_VERSION  
  7. FROM dbo.DepartDemo d  
  8. CROSS APPLY CHANGETABLE  
  9. (VERSION dbo.DepartDemo , (DID), (d.DID)) as ct  

邀月工作室

  1. UPDATE dbo.DepartDemo  
  2. SET DName = '中原明教',  
  3. CurState = 0  
  4. WHERE DID = 101  
  5.  
  6. SELECT d.DID, d.DName, d.Manager,  
  7. ct.SYS_CHANGE_VERSION  
  8. FROM dbo.DepartDemo d  
  9. CROSS APPLY CHANGETABLE  
  10. (VERSION dbo.DepartDemo , (DID), (d.DID)) as ct  

邀月工作室

  1. SELECT CHANGE_TRACKING_CURRENT_VERSION () as 當(dāng)前版本  
  2. /*  
  3. 當(dāng)前版本  
  4. 5  
  5. */  
  6.  
  7. --跟蹤外部程序哪一部分引起的更改,這樣好找出源頭  
  8. DECLARE @context varbinary(128) = CAST('明教內(nèi)訌引起分裂' as varbinary(128));  
  9. WITH CHANGE_TRACKING_CONTEXT (@context)  
  10. INSERT dbo.DepartDemo  
  11. (DName, Manager)  
  12. VALUES 
  13. ('天鷹教''殷天正')  
  14.  
  15. --查詢Context更改  
  16. SELECT DID,  
  17. SYS_CHANGE_OPERATION,  
  18. SYS_CHANGE_VERSION,  
  19. CAST(SYS_CHANGE_CONTEXT as varchar) ApplicationContext  
  20. FROM CHANGETABLE  
  21. (CHANGES dbo.DepartDemo, 5) AS CT  
  22. /*  
  23. DID SYS_CHANGE_OPERATION SYS_CHANGE_VERSION ApplicationContext  
  24. 104 I 6 明教內(nèi)訌引起分裂  
  25. */ 

邀月工作室

小結(jié):

本文總結(jié)了SQL Server中記錄數(shù)據(jù)變更的四個(gè)方法:觸發(fā)器、Output子句、SQL Server 2008中新增的變更數(shù)據(jù)捕獲(CDC)功能、同步更改跟蹤。其中后兩個(gè)是SQL Server 2008中新增的功能,在SQL Server 2012中更是與Always ON緊密集成。

1、不建議前兩個(gè)。

2、CDC用以實(shí)現(xiàn)異步跟蹤用戶表的數(shù)據(jù)修改,而且這一功能擁有最小的性能開銷,可以用于其他數(shù)據(jù)源的持續(xù)更新,例如將OLTP數(shù)據(jù)庫(kù)中的數(shù)據(jù)變更遷移到數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)庫(kù)。

3、”更改跟蹤”的最大優(yōu)勢(shì)是以最小的磁盤開銷來偵測(cè)凈行變更,它允許修改的數(shù)據(jù)以事務(wù)一致的形式表現(xiàn),并提供了檢測(cè)數(shù)據(jù)沖突的能力。

其他推薦文章:

1、在VS中如何將數(shù)據(jù)同步配置為使用 SQL Server 更改跟蹤(http://msdn.microsoft.com/zh-cn/library/cc714038.aspx)

2、SQL Server 2012中復(fù)制、更改跟蹤、更改數(shù)據(jù)捕獲和 AlwaysOn 可用性組 (SQL Server)(http://msdn.microsoft.com/zh-cn/library/hh403414%28v=sql.110%29.aspx)

原文鏈接:http://blog.csdn.net/downmoon/article/details/7443627

【編輯推薦】

  1. SQL Server 2008中增強(qiáng)的匯總技巧
  2. 從SQL Server刪除大數(shù)據(jù)說開去
  3. 監(jiān)控SQL Server的運(yùn)行狀況
  4. SQL Server數(shù)據(jù)庫(kù)恢復(fù)案例分享
  5. SQL Server鏡像功能完全實(shí)現(xiàn)
責(zé)任編輯:林師授 來源: 邀月周記
相關(guān)推薦

2010-03-23 09:52:23

SQL Server

2011-08-25 13:41:50

SQL Server 變更跟蹤

2010-12-17 09:11:41

SQL Server

2010-09-13 09:58:17

SQL Server2

2010-07-19 13:22:45

SQL Server

2009-04-27 13:42:38

SQL Server Hierarchyid微軟

2009-02-16 13:21:25

數(shù)據(jù)挖掘SQL Server SQL Server

2009-04-16 18:25:55

2009-02-16 17:18:31

恢復(fù)備份模式

2009-02-16 17:03:57

管理開發(fā)效能

2010-06-03 17:22:27

2010-06-28 11:28:26

2009-04-16 18:07:39

2013-03-13 09:53:50

SQL Server

2011-08-01 09:09:07

SQL Server SQL Server 數(shù)據(jù)庫(kù)

2010-10-21 12:03:35

SQL Server視

2024-01-12 09:30:09

CDC變更數(shù)據(jù)捕獲系統(tǒng)

2010-03-05 09:27:07

SQL Server

2010-09-13 14:35:58

sql server端

2011-08-16 18:29:45

SQL Server 數(shù)據(jù)貨場(chǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久精品香蕉视频| 亚洲a∨日韩av高清在线观看| 免费日本黄色网址| 中日韩脚交footjobhd| 久久久久久久久蜜桃| 国产精品久久久久久久久久东京| 亚洲精品国产精品乱码在线观看| 一区二区三区在线资源| 欧美日韩国产一区中文午夜| 日本成人看片网址| 99在线精品视频免费观看20| 国产日韩亚洲欧美精品| 深夜福利日韩在线看| 久久久久久久久久久成人| 国产在线精品播放| 精品无码黑人又粗又大又长| 精品国产一区二区三区av片| 日韩一区二区三区av| 国产在线青青草| 成人日韩欧美| 久久综合色天天久久综合图片| 91久久国产精品| 久久久精品福利| 午夜激情一区| 中文字幕精品av| 黄色av网址在线观看| 色综合视频一区二区三区日韩| 天天操天天干天天综合网| 亚洲 欧洲 日韩| 国产视频网站在线| av资源网一区| 日韩精品免费视频| 久久亚洲国产精品| 日本黄色大片在线观看| 精品免费av一区二区三区| 一区二区三区高清不卡| 少妇特黄a一区二区三区| 色婷婷在线视频| 国产一区二区三区黄视频 | 岛国视频免费在线观看| 成人午夜免费电影| 69174成人网| 91亚洲视频在线观看| 视频一区视频二区在线观看| 97久久国产精品| 亚洲色婷婷一区二区三区| 欧美日韩中文一区二区| 国产网站欧美日韩免费精品在线观看| 色欲欲www成人网站| 亚洲欧美在线人成swag| 欧美视频中文一区二区三区在线观看 | 免费看国产片在线观看| 国产剧情一区在线| 成人欧美在线视频| 国产精品久久久久久久免费 | 欧美亚洲国产日韩2020| 国产精品成人久久| 91久久黄色| 97国产一区二区精品久久呦| 日韩 欧美 精品| 亚洲免费观看| 欧美中在线观看| 无码人妻黑人中文字幕| 天堂av在线一区| 国产精品精品久久久久久| 欧美性受xxx黑人xyx性爽| 青青青爽久久午夜综合久久午夜| 国产精品草莓在线免费观看| 伊人久久一区二区| 国产专区综合网| http;//www.99re视频| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 成人免费视频观看视频| 蜜桃av噜噜一区二区三区麻豆| 成人免费观看av| 国产欧美日韩一区二区三区| 亚洲欧洲视频在线观看| 国产三级三级三级精品8ⅰ区| 久久精品国产综合精品| 国家队第一季免费高清在线观看| 欧美经典一区二区| 国产91av视频在线观看| 天使と恶魔の榨精在线播放| 亚洲国产一区二区三区| www国产黄色| 欧美aaa大片视频一二区| 欧美日韩一区二区三区在线免费观看| 欧美激情精品久久久久久小说| 国产高清av在线播放| 国产精品探花在线| 欧美视频第一页| a在线观看免费视频| 豆花视频一区| 日韩电影免费在线观看中文字幕| 性高潮久久久久久久| 99热在线成人| 91av在线免费观看视频| 中文字幕在线日亚洲9| 国产成人在线观看| 免费国产一区| 老司机午夜在线视频| 亚洲福利一二三区| 一区二区xxx| 911亚洲精品| 亚洲偷熟乱区亚洲香蕉av| 国产精品视频一区二区三| 欧美一级一区| 97伦理在线四区| 免费在线国产| 亚洲专区一二三| 久久撸在线视频| 久草在线综合| 精品中文字幕乱| 国产一卡二卡三卡| 粉嫩嫩av羞羞动漫久久久| 午夜精品一区二区三区在线观看| 欧美78videosex性欧美| 欧美午夜影院一区| 久久无码人妻精品一区二区三区| 婷婷亚洲图片| 国产精品69av| 亚洲色欧美另类| 亚洲毛片av在线| 波多野结衣天堂| 日韩电影不卡一区| 欧美激情一区二区三区高清视频| 亚洲天堂手机版| 久久久久国产精品厨房| 国产九色porny| 欧美成人精品午夜一区二区| 少妇激情综合网| 91视频久久久| 26uuu亚洲综合色欧美| 亚洲欧美日韩国产手机在线| 日本成人三级| 欧美一级鲁丝片| 亚洲第一福利网| 激情视频在线播放| 国精品**一区二区三区在线蜜桃| 四虎影视永久免费在线观看一区二区三区| 电影在线观看一区| 精品国产sm最大网站免费看| 欧美人妻精品一区二区免费看| 麻豆精品在线观看| 亚洲欧美久久234| 99re66热这里只有精品4| 亚洲嫩模很污视频| 国产九色在线播放九色| 99久久国产综合精品麻豆| 97超碰国产精品| 无码国模国产在线观看| 久久久91精品国产一区不卡| 一区二区精品视频在线观看| 国产精品久久久久久久久免费相片| 久草综合在线观看| 国产一区日韩| 国产精品免费一区豆花| 日韩精品黄色| 欧美乱妇15p| 一起操在线播放| 国产成人在线免费观看| 亚洲国产精品成人天堂| 农村少妇一区二区三区四区五区| 4438全国成人免费| 嫩草研究院在线| 欧洲一区二区三区免费视频| 日韩av片在线免费观看| 国产一区美女在线| 国产免费裸体视频| 任你弄精品视频免费观看| 亲爱的老师9免费观看全集电视剧| 免费福利在线视频| 欧美人动与zoxxxx乱| www.av成人| 国产成人av电影在线播放| 国产肉体ⅹxxx137大胆| 欧美高清视频看片在线观看 | 色大师av一区二区三区| 懂色aⅴ精品一区二区三区| 国产一本一道久久香蕉| 亚洲男人第一av网站| 国产精品久久久久久久久久久久久久久久久 | 成人高潮视频| 51精品在线观看| yiren22综合网成人| 日韩一区二区中文字幕| 日本中文字幕在线免费观看| 国产亚洲精品7777| 手机免费av片| 亚洲毛片播放| 亚洲精品影院| 91蝌蚪精品视频| 97视频在线观看成人| 福利成人在线观看| 日韩午夜在线播放| 日韩在线 中文字幕| 成人免费视频在线观看| 亚洲黄色免费在线观看| 精品一区二区三区视频在线观看| 97干在线视频| 日韩久久精品网| 国产精品日韩一区二区三区| 成人日韩在线| 久久久免费电影| 99青草视频在线播放视| 亚洲第一中文字幕在线观看| 一区二区视频在线免费观看| 亚洲第一主播视频| 可以免费看av的网址| 26uuu亚洲| 久久无码专区国产精品s| 日本欧洲一区二区| 国产原创中文在线观看 | 精品视频一区二区三区在线观看 | 男人j进女人j| 国产精品一线天粉嫩av| 成人av免费看| 国产视频一区二区在线播放| 不卡的av中国片| 亚洲欧美日韩精品久久久 | 手机av免费在线| 综合国产在线观看| 青青草免费在线视频| 日韩精品在线一区二区| 亚洲图片中文字幕| 一本在线高清不卡dvd| 精品肉丝脚一区二区三区| 亚洲色大成网站www久久九九| 小早川怜子久久精品中文字幕| 成人免费看视频| 美女被爆操网站| 精品一区二区三区视频| 黄色手机在线视频| 视频在线观看国产精品| 欧美日韩亚洲一| 夜夜嗨av一区二区三区网站四季av| 青青草视频国产| 一本精品一区二区三区| 亚洲午夜精品一区二区三区| 成人激情开心网| 日本一区二区三区四区在线观看| 天堂99x99es久久精品免费| 国产日韩欧美一区二区三区四区 | 欧美另类一区| 天堂在线精品| 狠狠干一区二区| 欧美日韩一本| 国模一区二区三区私拍视频| 久久久免费毛片| 精品国产综合久久| 欧美男男freegayvideosroom| 国产伦精品一区二区三区视频免费| theporn国产在线精品| 成人国产亚洲欧美成人综合网| 一本一道久久a久久精品综合| 成人影视亚洲图片在线| 午夜午夜精品一区二区三区文| 国产探花一区| 亚洲欧洲日夜超级视频| 凹凸成人精品亚洲精品密奴| 亚洲国产精品综合| 视频在线不卡免费观看| 最新中文字幕久久| 一区二区三区午夜视频| 男人的天堂avav| 亚洲男人影院| 欧美男女交配视频| 国产一区二区三区蝌蚪| 美国黄色一级视频| 99精品1区2区| 第一次破处视频| 国产精品久久久久桃色tv| 国产精品免费人成网站酒店| 亚洲永久精品国产| 国产欧美一区二区三区在线看蜜臂| 欧美日韩亚洲视频一区| 蜜臀99久久精品久久久久小说| 欧美亚洲动漫精品| 91成品人影院| 精品处破学生在线二十三| 四虎影视2018在线播放alocalhost| 亚洲欧美国产精品久久久久久久| av片在线免费观看| 欧美成人激情在线| 英国三级经典在线观看| 国产精品丝袜久久久久久高清| 久久免费精品| 免费看成人av| 婷婷六月综合| 亚洲午夜性刺激影院| 国产主播在线观看| 在线免费观看日本欧美| 国产xxxx孕妇| 亚洲人成亚洲人成在线观看| 成人在线观看亚洲| 欧美中文字幕精品| 在线日韩三级| 精品九九九九| 婷婷另类小说| 久久久久国产精品熟女影院| 国产精品一品二品| 黑人巨大精品欧美| 伊人开心综合网| 波多野结衣绝顶大高潮| 欧美成人精品3d动漫h| 草碰在线视频| 亚洲3p在线观看| 国产精品一区二区三区av| 欧美日韩国产不卡在线看| 欧美日本中文| 污污的网站免费| 久久久99久久| 男人天堂中文字幕| 7777精品伊人久久久大香线蕉最新版| 色视频在线观看免费| 欧美成在线观看| 91福利精品在线观看| 精品亚洲一区二区三区四区五区高| 欧美大人香蕉在线| 黄色一级大片在线观看| 99精品视频一区二区三区| 男女性高潮免费网站| 91传媒视频在线播放| 无码国产精品一区二区色情男同| 免费91麻豆精品国产自产在线观看| 亚洲精品一级二级| 久久国产精品 国产精品| 精品av久久久久电影| 久久综合桃花网| 国产精品福利一区二区| 成人免费一级片| 亚洲欧洲视频在线| 久久久久久久| 麻豆精品传媒视频| 91精品国自产在线| 亚洲人午夜精品天堂一二香蕉| 成人免费一级片| 国产亚洲精品久久久久久牛牛| 婷婷电影在线观看| 久久av免费观看| 在线码字幕一区| 91精品国产91久久久久久密臀| 国产一区二区在线免费| 亚洲涩涩av| 青青青在线播放| wwwwww.欧美系列| 久草视频在线观| 亚洲精品www久久久久久广东| 91超碰在线| 精品蜜桃一区二区三区| 在线亚洲激情| 日韩aaaaa| 欧美午夜宅男影院在线观看| 五月天激情婷婷| 88xx成人精品| 亚洲成aⅴ人片久久青草影院| 国产日韩一区二区在线| 国产日韩欧美综合在线| 国产美女www| www国产91| 香蕉免费一区二区三区在线观看| 无码毛片aaa在线| 国产91精品一区二区麻豆网站| 久久久精品一区二区涩爱| 亚洲成人激情图| 欲香欲色天天天综合和网| 日韩国产欧美精品| 久99久精品视频免费观看| 加勒比av在线播放| 亚洲国产一区二区三区在线观看| 一个人www视频在线免费观看| 日韩电影免费观看高清完整| 久久99国产精品尤物| 久久久久无码国产精品不卡| 亚洲黄页网在线观看| 456亚洲精品成人影院| 在线丝袜欧美日韩制服| 国产成人免费高清| 国产精品免费精品一区| 色妞在线综合亚洲欧美| 亚洲天堂中文字幕在线观看| 国产免费黄色av| 国产精品理论片| 亚洲欧美另类综合| 热久久这里只有精品| 欧美激情理论| 中文字幕免费在线播放| 欧美日韩一区国产| 国产黄色大片在线观看| 日本一区视频在线| 国产一区二区美女诱惑| 可以在线观看av的网站| xxav国产精品美女主播| 九九热hot精品视频在线播放 | 18av在线播放| 欧美色图亚洲自拍| 国产成人免费视| 18国产免费视频| 77777少妇光屁股久久一区| 色天天综合网|