【问题标题】:How to track number of changes occured in a column? T-SQL - SQL Server如何跟踪列中发生的更改次数? T-SQL - SQL 服务器
【发布时间】:2010-05-02 19:13:30
【问题描述】:
例如,我有一个名为 EmployeeName 的列。
每次用户更改/修改他的名字时,我都需要进行计数。如果他两次改名,则计数为 2。此外,我需要将员工每次更改的时间存储在 EmployeeName 上,例如如果名称本质上是 James 并且创建的时间是上午 9:00,然后员工在上午 11:00 更改为 John,我需要保留这个新时间和新值以及之前的时间和值,即上午 9:00 的 James .
我希望它清楚!谢谢你们...将选择最佳答案...
如果这需要触发器,非常感谢提供粗略的伪代码。
【问题讨论】:
标签:
sql
sql-server
tsql
sql-server-2008
【解决方案1】:
首先 - 如果尚未实施,强烈建议使用永久标识符(即 NOT EmployeeName)识别员工,这样您就可以跟踪所有内容。
如果您想使用触发器,可以使用 AFTER UPDATE 触发器并使用 if update(EmployeeName) 查找名称的更改。
如果已更新,您可以同时增加 Employee 表上的计数列。使用inserted 表来识别那些已更新的条目。 (计数是否必要?如果您要存储名称更改的历史记录,我认为没有必要有一个计数列 - 这是多余的信息。)
然后,您将在员工姓名历史记录表中添加一行,其中包含此更改的详细信息以及当前时间戳。
【解决方案2】:
一个触发器就足够了。触发器应该尽可能简单和轻量级,因此只需在某个日志表中插入一个条目,然后在其上计算聚合。
【解决方案3】:
在 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');