例如,我有一个名为EmployeeName的列。
每次用户更改/修改他的名字时,我都需要保持计数。如果他更改了他的名字两次,那么count就是2.此外,我需要存储员工对EmployeeName所做的每次更改的时间,例如如果名称基本上是詹姆斯,创建的时间是上午9:00,然后员工在上午11:00更改为约翰,我需要保留这个新的时间和新值,以及前一个时间是詹姆斯上午9:00点。
我希望它清楚!谢谢你们......将选择最佳答案......
如果需要触发器,那么非常感谢提供粗略的伪代码。
答案 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');