【问题标题】: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');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-12
          • 2010-09-26
          • 1970-01-01
          • 2015-01-18
          • 1970-01-01
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多