设为首页 加入收藏

TOP

SqlServer更改跟踪(ChangTracking)(二)
2015-07-24 10:16:01 来源: 作者: 【 】 浏览:5
Tags:SqlServer 更改 跟踪 ChangTracking
CHANGE_TRACKING_MIN_VALID_VERSION,CHANGE_TRACKING_CURRENT_VERSION)

?

?

--	获取一个表的最低有效版本号
SELECT CHANGE_TRACKING_MIN_VALID_VERSION( OBJECT_ID('dbo.TestTab'))

--	返回与上次提交的事务相关联的版本,以确定下次需要更改时将使用的版本
SELECT CHANGE_TRACKING_CURRENT_VERSION()
--------------------
0

(1 行受影响)

--------------------
4

(1 行受影响)

再次用CHANGETABLE 查看:

?

?

SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,0) as T
\
为什么不是更新(SYS_CHANGE_OPERATION = 'U')??

?

last_sync_version = 0 为当时的跟踪情况,现在 SYS_CHANGE_VERSION 已经大于1 了,要查询各状态当时更改情况,如:

?

--	返回最后一次版本号之后的更改(需指定 last_sync_version )
--	该值 last_sync_version 必须保持记住,下次可以现在查到的@last_sync_version = CHANGE_TRACKING_CURRENT_VERSION()
SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,0) as T
SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,1) as T
SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,2) as T
SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,3) as T
\
注:最后两次更改是相同的的,所以 SYS_CHANGE_COLUMNS 一样。

?

还可以使用 CHANGE_TRACKING_IS_COLUMN_IN_MASK查看更改列情况 (需启用 TRACK_COLUMNS_UPDATED = ON )

?

--	检查更改跟踪(查看哪些列曾更改)
SELECT CHANGE_TRACKING_IS_COLUMN_IN_MASK (
  
   ,
   
    ) -- column_id : 是正在被检查的列的 ID。 可以使用 COLUMNPROPERTY 函数获取此列 ID。 -- change_columns : 是 CHANGETABLE 数据的 SYS_CHANGE_COLUMNS 列中的二进制数据。 --(如主键列更改,视为删除旧值,插入新值) SELECT id ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'id','COLUMNID'),SYS_CHANGE_COLUMNS) id_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'name','COLUMNID'),SYS_CHANGE_COLUMNS) name_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'insertDate','COLUMNID'),SYS_CHANGE_COLUMNS) insertdate_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'value','COLUMNID'),SYS_CHANGE_COLUMNS) value_is_changed ,CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('TestTab'),'info','COLUMNID'),SYS_CHANGE_COLUMNS) info_is_changed FROM CHANGETABLE(CHANGES dbo.TestTab,1) AS T WHERE SYS_CHANGE_OPERATION='U' 
   
  
\

?

在进行删除和插入操作:

?

delete from [dbo].[TestTab] where id=1

insert into [dbo].[TestTab](id,name,insertDate,value,info)
select 4,'kk',GETDATE(),10,'info'

--	查看版本号为3之后都操作了什么?
SELECT * FROM CHANGETABLE(CHANGES dbo.TestTab,3) as T
\

?

对于当前表的记录是:

?

SELECT T.id,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,D.*
FROM CHANGETABLE(CHANGES dbo.TestTab,3) AS T
LEFT JOIN [dbo].[TestTab] AS D ON T.id = D.id
\

?

?

对于数据定时转移的情况:
源表中数据进行了 insert,update,delete 操作

目标表操作如下:
insert : 跟踪表关联源表,查询到的数据插入到目标表中.(即使插入后的数据发送更改,在改版本号之显示还是操作插入"I")
update : 跟踪表关联源表,查询到的数据更新到目标表中.也可使用函数 CHANGE_TRACKING_IS_COLUMN_IN_MASK 更新了哪些列
delete : 对于删除 (SYS_CHANGE_OPERATION = 'D'),跟踪表直接对目标表进行删除(注意主键不可相同!否则可能删错)

--数据转移情况,根据版本号更改,所以版本号要记住!
源表: [TestTab]
目标表: [TargetTestTab]

--insert : 
INSERT INTO [TargetTestTab](id,name,insertDate,value,info)
SELECT D.id,name,insertDate,value,info
FROM CHANGETABLE(CHANGES dbo.TestTab,3) AS T
INNER JOIN [dbo].[TestTab] AS D ON T.id = D.id
WHERE SYS_CHANGE_OPERATION = 'I'

--update : 
UPDATE K SET K.id=D.id,K.name=D.name,K.insertDate=D.insertDate,K.value=D.value,K.info=D.info
FROM CHANGETABLE(CHANGES dbo.TestTab,3) AS T
INNER JOIN [dbo].[TestTab] AS D ON T.id = D.id
INNER JOIN [db
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇SqlServer变更数据捕获(CDC) 下一篇用PL/SQLDeveloper工具实现相同表..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何从内核协议栈到 (2025-12-27 03:19:09)
·什么是网络协议?有哪 (2025-12-27 03:19:06)
·TCP/ IP协议有哪些 (2025-12-27 03:19:03)
·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)