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

时间:2010-04-29 11:41:00

标签: sql sql-server tsql sql-server-2008

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

每次用户更改/修改他的名字时,我都需要保持计数。如果他更改了他的名字两次,那么count就是2.此外,我需要存储员工对EmployeeName所做的每次更改的时间,例如如果名称基本上是詹姆斯,创建的时间是上午9:00,然后员工在上午11:00更改为约翰,我需要保留这个新的时间和新值,以及前一个时间是詹姆斯上午9:00点。

我希望它清楚!谢谢你们......将选择最佳答案......

如果需要触发器,那么非常感谢提供粗略的伪代码。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

触发器就足够了。触发器应该尽可能简单和轻量级,因此只需在一些日志记录表中插入一个条目,然后在其上计算聚合。

答案 2 :(得分:0)

在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');