sqlserver 更改跟踪案例

create database test
go

use test
go
create table t1
(
sid int identity(1,1) not null primary key,
sno int not null,
sname varchar(200)
)
go

insert into t1(sno,sname) values(101,'wind')
go

ALTER DATABASE [test] SET RECOVERY SIMPLE WITH NO_WAIT
GO

ALTER DATABASE [test]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
go

ALTER TABLE dbo.t1
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)
go

--变更记录表
create table veridrecord
(
lvid bigint not null,
nvid bigint not null,
isover  bigint
)
go
insert into veridrecord(lvid,nvid) values(1,1)
go

---捕获业务数据表
CREATE TABLE [dbo].[tempt1](
	[sid] [int] NOT NULL,
	[sno] [int] NOT NULL,
	[sname] [varchar](200) NULL,
	[addtime] [datetime] NULL
)
go

ALTER TABLE [dbo].[tempt1] ADD  CONSTRAINT [DF_tempt1_addtime]  DEFAULT (getdate()) FOR [addtime]
GO

----测试数据
insert into t1(sno,sname) values(101,'a')
insert into t1(sno,sname) values(102,'b')
insert into t1(sno,sname) values(103,'c')
insert into t1(sno,sname) values(104,'d')
go

set nocount on
update t1 set sno='9899' where sno=102
go

---查看变更捕获

DECLARE @synchronization_version bigint
DECLARE @this_version bigint
DECLARE @pid int =COLUMNPROPERTY( OBJECT_ID('dbo.t1'),'sno','ColumnId')
declare @a bigint
declare @b bigint
declare @c bigint
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION()
select @a=lvid from veridrecord
select @b=nvid from veridrecord
select @c=isover from veridrecord
if @synchronization_version>@b
	begin
		if @c=1
			begin
			update veridrecord set lvid=nvid
			update veridrecord set [email protected]_version
			select @this_version=lvid from veridrecord
			select @this_version
			insert into tempt1(sid,sno,sname)
			select k.sid,k.sno,k.sname from
			(
			SELECT P.sid, P.sno,P.sname,
				CT.SYS_CHANGE_OPERATION,ct.SYS_CHANGE_VERSION,
				case
		when CHANGE_TRACKING_IS_COLUMN_IN_MASK ( @pid , SYS_CHANGE_COLUMNS) =0 then 'NO'
		when  CHANGE_TRACKING_IS_COLUMN_IN_MASK ( @pid , SYS_CHANGE_COLUMNS ) =1 then 'YES'
		 else '其它'
		 end ischange
		FROM dbo.t1 AS P
		inner join
		CHANGETABLE(CHANGES dbo.t1,@this_version) AS CT
		ON
		P.sid = CT.sid where ct.SYS_CHANGE_VERSION>@this_version
		) k where k.ischange='YES'
		end
	end
else
	begin
	select 'no changes'
	end
update veridrecord set isover=1
go

select * from tempt1

时间: 2024-11-03 05:41:57

sqlserver 更改跟踪案例的相关文章

sqlserver 更改跟踪相关知识

用法相关文章: http://www.cnblogs.com/studyzy/archive/2009/01/07/1370937.html http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html 注意事项: https://technet.microsoft.com/zh-cn/library/hh710064(v=sql.120).aspx https://support.microsoft.com/zh-cn/kb/9

SQL Server 2008新特性——更改跟踪

在大型的数据库应用中,经常会遇到部分数据的脱机和多个数据库的合并问题.比如现在有一个全省范围使用的应用程序,每个市都部署了单独的相同的应用程序服务器和数据库服务器,每个月需要将全省所有市的数据全部汇总起来用于出全省的报表,这是一种很常见的数据库合并问题.再比如我们做了一个SmartClient的应用程序,每个客户端都有应用程序和数据库,另外还有一个中心数据库用于汇总所有客户端的数据.每个智能客户端上都可以对自己的数据库进行增删改查,一旦智能客户端连接到网络上时,系统就将客户端数据库中的数据更改全

SQL Server审计功能入门:更改跟踪(Change Tracking)

介绍 更改跟踪是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制.常规的,自定义变更跟踪和读取跟踪数据,会使用触发器,存储过程和记录变更的用户表等, 还需要保证访问一致和相关清理工作. 使用CT会减少额外工作量和保证访问一致性. 启用CT的表上必须得有主键,所有版本适用.为了保证更改信息的有效性,官方建议结合快照隔离使用. CT只能提供: 哪些行/列发生了更改 被更改行的最新数据. 不能提供:更改发生的次数,中间值. 应用:离线缓存的更新,ETL更新 注意事项: 1. 写入变更到变更

SQL Server 2008新增的变更数据捕获和更改跟踪

本文主要介绍SQL Server中记录数据变更的四个方法:触发器.Output子句.SQL Server 2008中新增的变更数据捕获(Change Data Capture 即CDC)功能.同步更改跟踪.其中后两个为SQL Server 2008所新增. 一.触发器 在SQL Server的早期版本中,如果要记录某个表或视图的Insert/Update/Delete操作,我们可以借助触发器(Trigger)(http://msdn.microsoft.com/zh-cn/library/ms1

使用更改跟踪(ChangeTracking)来实现数据类型变更

在现实场景中,我们经常会遇到修改数据类型的场景,尤其是自增列从INT修改为BIGINT的情况,自增列又通常作为表的主键和聚集索引键,因此修改操作需要按以下步骤来进行 1. 停止对该表的访问(通过禁用权限或停应用的方式实现) 2. 删除非聚集索引 3. 删除主键聚集索引 4. 使用ALTER TABLE ALTER COLUMN来修改 5. 创建主键聚集索引 6. 创建非聚集索引 此方式有以下缺点: 1. 整个ALTER COLUMN操作作为一个事务,需要对将每条数据修改操作记录到日志中,中途撤销

SqlServer 更改复制代理配置文件参数及两种冲突策略设置

原文:SqlServer 更改复制代理配置文件参数及两种冲突策略设置 由于经常需要同步测试并更改代理配置文件属性,所以总结成脚本,方便测试. 可更新订阅的冲突策略有两种情况:一是在发布中冲突,即订阅数据到发布时冲突:二是在订阅冲突,发布数据到订阅时冲突. 队列读取器设置的是:发布到订阅的冲突策略 代理配置参数位置: 里面的参数是需要更改的,未显示的参数,则是没有添加到配置文件的.但是取消上面的勾选是可以看到还有那些配置参数. 使用复制代理配置文件参考:https://msdn.microsoft

SqlServer常见问题及案例(性能+维护)

缺少索引 案例:某次线上有很多接口请求失败,服务器上发现CPU使用率很高.通过活动分析器(最近耗费大量资源的查询)发现有几个查询的CPU时间(毫秒/秒)达到3000以上.推测是查询没有利用索引导致的,通过在相关表上加索引解决了问题. 分析:大部分性能问题都是因为缺失索引或索引失效导致的(书签查找).此次问题是由于基础表(配置表)之间的连接没有索引,当随着配置的数据越来越多,查询计算量会越来越大,当数据量达到一定量级(几千至几万)且并发比较高(几千)问题就会显现出来.这些问题可以在写查询时建立索引

SQLSERVER 更改默认端口号

最近这几天,服务器的数据库(SQLSERVER)老是遭受到攻击,有人不断地轮训想登陆数据库,从SQL的日志里可以看出来,一开始我是通过本地安全策略禁用了对应的几个攻击ip,同时把数据库的sa账号给禁用了,想着应该可以了吧,毕竟我的服务器上面没啥那么珍贵的,何必这样揪着不放呢?!谁知道第二天起来看,卧槽,竟然还在攻击,换了ip,同时不断地更改数据库账户来攻击,cnm,这人真蛋疼.日志图如下: 然后我就准备更改数据库的默认端口号,免得再被攻击,哎,我也蛋疼,更改数据库默认端口号,意味着我要更改每个应

SqlServer 更改复制代理配置文件参数

由于经常需要同步测试并更改代理配置文件属性,所以总结成脚本,方便测试. 代理配置参数位置: 里面的参数是需要更改的,未显示的参数,则是没有添加到配置文件的.但是取消上面的勾选是可以看到还有那些配置参数. 使用复制代理配置文件参考:https://msdn.microsoft.com/zh-cn/library/ms147893(v=sql.100).aspx 查看复制代理配置文件(MSagent_profiles) select * from msdb.dbo.MSagent_profiles