如何跟踪字段值的变化?

xugang96 2009-11-30 09:37:14
我有一个客户表CUSCBA,里面有100个字段,但想跟踪其中15个字段的变化,如果这15个字段有任何一个值发生变化就把他们一起存到一个历史变更表中,有什么简单一点的方法吗?
...全文
145 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyongfeifei 2009-12-01
  • 打赏
  • 举报
回复
感觉非常好,一定学习
sytdeedee 2009-12-01
  • 打赏
  • 举报
回复
触发器 IF UPDATE...
Yang_ 2009-12-01
  • 打赏
  • 举报
回复
http://blog.csdn.net/Haiwer/archive/2008/10/04/3016270.aspx
xugang96 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dawugui 的回复:]
我觉得楼主貌似没理解我的意思.
[/Quote]
我是没有整明白您的意思!

其实我的要求就是在编辑记录时,如果发现我要跟踪的15个字段值发生了变化,就把他之前的值存储到历史表中以便后续查询;因为客户的信息是不能随便改动的....
fcuandy 2009-12-01
  • 打赏
  • 举报
回复
采用触发器的朋友自己去测试

update tb set a=a
是否符合 if update(a)

这个判断逻辑是无效的。
dawugui 2009-11-30
  • 打赏
  • 举报
回复
我觉得楼主貌似没理解我的意思.
华夏小卒 2009-11-30
  • 打赏
  • 举报
回复
可以加入更新时间

--3、更新
update @tb
set name=name+'WelCome!'
output inserted.id,
deleted.id,
getdate() as 修改时间
--into @tt(new_id,old_id)
where id=4

id id 修改时间
----------- ----------- -----------------------
4 4 2009-11-30 22:09:10.340
xugang96 2009-11-30
  • 打赏
  • 举报
回复
我只需要跟踪其中15个字段就可以了,其他字段跟踪来没有多大意思
-狙击手- 2009-11-30
  • 打赏
  • 举报
回复
你这样怎么知道何时变化 呀?
华夏小卒 2009-11-30
  • 打赏
  • 举报
回复
--> 测试数据: @tb
declare @tb table (id int,name varchar(20))
insert into @tb
select 1,'a' union all
select 2,'b'

--> 测试表: @tt
declare @tt table (new_id int,old_id int)


-----------------------------------
-------->SQL 2005
-----------------------------------
--1、插入
insert @tb
output inserted.id
into @tt(old_id)
select 3,'c' union all
select 4,'d'

select * from @tt
/*
new_id old_id
----------- -----------
NULL 3
NULL 4
*/

---------------------------------------
--2、删除
delete @tb
output deleted.id
into @tt (old_id)
where id<=2

select * from @tt
/*
new_id old_id
----------- -----------
NULL 3 ----3和4是上面的 插入产生的
NULL 4
NULL 1
NULL 2
*/

---------------------------------------
--3、更新
update @tb
set name=name+'WelCome!'
output inserted.id,
deleted.id
into @tt(new_id,old_id)
where id=4

select * from @tt
/*
new_id old_id
----------- -----------
NULL 3
NULL 4
NULL 1
NULL 2
4 4
*/
dawugui 2009-11-30
  • 打赏
  • 举报
回复
如果数据不多的话,放在一个表即可.

如果确实很多,就把数据转移到历史表中去,这个表只保留最新的数据.

不过做法和上面机会一模一样.只不过历史表里面少最新的数据而已.
xugang96 2009-11-30
  • 打赏
  • 举报
回复
我这样做算了:
if exists(select CBA001 from CUSCBA where CBA001=@CBA001 and CBA003<>@CBA003
union
select CBA001 from CUSCBA where CBA001=@CBA001 and CBA004<>@CBA004
union
select CBA001 from CUSCBA where CBA001=@CBA001 and CBA005<>@CBA005
.....)
insert into 变更历史表
select CBA001,@CBA003.....
dawugui 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xugang96 的回复:]
关键字肯定不会变的,主要就是跟踪一下:公司名称、联系人、联系电话、电子邮件等常用信息
[/Quote]
那就是我上面说的意思.
只要每次数据变更,你就增加序号,这样一来,对于这个关键字,一般是企业代码,其所有历史数据都存在.
xugang96 2009-11-30
  • 打赏
  • 举报
回复
关键字肯定不会变的,主要就是跟踪一下:公司名称、联系人、联系电话、电子邮件等常用信息
dawugui 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 xugang96 的回复:]
  我有一个客户表CUSCBA,里面有100个字段,但想跟踪其中15个字段的变化,如果这15个字段有任何一个值发生变化就把他们一起存到一个历史变更表中,有什么简单一点的方法吗?
[/Quote]
没有.

这个需求一般是这么做?
一个关键字,一个序号.
初次插入数据,序号为一.
任何一个字段(或者你说的其中15个字段任何一个更改了),数据增加.
关键字不变,序号加一.
针对不同的关键字,其最大序号是最终数据.
明白我说的意思了吗?

这种做法一般是工商局,税务局的系统,企业的基本数据(例如地址,电话,投资总额....)发生变化后的做法.
-狙击手- 2009-11-30
  • 打赏
  • 举报
回复
触发器呀
里面判断
if update('')
--小F-- 2009-11-30
  • 打赏
  • 举报
回复
触发器?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧