繁体   English   中英

如何跟踪列中发生的更改数量? T-SQL-SQL Server

[英]How to track number of changes occured in a column? T-SQL - SQL Server

例如,我有一个名为EmployeeName的列。

每次用户更改/固定他的名字时,我都需要保持计数。 如果他两次更改姓名,则计数为2。此外,我需要在EmployeeName上存储员工进行的每次更改的时间,例如,如果姓名本质上是James,创建的时间是9:00 AM,然后员工在11点更改为John :00 AM,我需要保留这个新时间和新值以及上一个9:00 AM的James。

希望清楚! 谢谢大家...将选择最佳答案...

如果这需要触发,给出一个粗略的伪代码将不胜感激。

首先-如果尚未实施,强烈建议使用永久性标识符(即NOT EmployeeName)来标识员工,这样您就可以跟踪所有情况。

如果要使用触发器,则可以使用AFTER UPDATE触发器,并使用if update(EmployeeName)查找名称更改。

如果已更新,则可以同时增加Employee表上的count列。 使用inserted表来标识那些已更新的条目。 (计数是必不可少的吗?如果您要存储名称更改的历史记录,我认为没有必要设置计数列-这是多余的信息。)

然后,您将在员工姓名历史记录表中添加一行,其中包含此更改的详细信息以及当前时间戳。

触发器就足够了。 触发器应尽可能简单和轻巧,因此只需将条目插入某些日志表中,然后在其上计算聚合。

在SQL Server 2008中,您具有新的“更改数据捕获”功能,可以使用它来获取更改的数量以及所做的更改: http : //weblogs.sqlteam.com/derekc/archive/2008/01/28/60469的.aspx

示例Northwind代码,因为链接会随着时间的流逝而消失:

EXEC Sp_cdc_enable_table 
  humanresources , 
  employee , 
  'HumanResources_Employee' , 
  1 , 
  dbo 


UPDATE humanresources.employee 
SET    ContactId = 1 
WHERE  employeeid = 1 

DECLARE @begin_lsn BINARY(10), @end_lsn BINARY(10)

SELECT @begin_lsn = sys.fn_cdc_get_min_lsn('humanresources_employee')
SELECT @end_lsn = sys.fn_cdc_get_max_lsn()

SELECT * FROM cdc.fn_cdc_get_all_changes_humanresources_employee(@begin_lsn, @end_lsn, 'all');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM