【问题标题】:versioning of a table表的版本控制
【发布时间】:2011-03-27 07:20:17
【问题描述】:

任何人都见过每条记录有多个版本的表格示例

如果你有桌子的话

Person(Id, FirstName, LastName)

并且您更改记录的姓氏而不是两个版本的姓氏(第一个版本和更改后的版本)

【问题讨论】:

    标签: sql


    【解决方案1】:

    我们这样做的方式(可能不是最好的方式)是拥有一个活动位字段,以及一个返回父记录的外键。因此,对于一般查询,您可以过滤在职员工,但您可以通过员工 ID 获取单个员工的历史记录。

    declare @employees
    (
        PK_emID int identity(1,1),
        EmployeeID int,
        FirstName varchar(50),
        LastName varchar(50),
        Active bit,
        FK_EmployeeID int
        primary key(PK_emID)
    )
    
    
    insert into @employees
    (
        EmployeeID,
        FirstName,
        LastName,
        Active,
        FK_EployeeID
    )
    select 1, 'David', 'Engle', 1,null
    union all
    select 2, 'Amy', 'Edge', 0,null
    union all
    select 2, 'Amy','Engle',1,2 
    

    【讨论】:

      【解决方案2】:

      我已经看到了这两种方法。第一个是通过添加EffectiveDateCancelDate(或类似的)在表本身中。要获取给定记录的当前值,您可以执行以下操作:SELECT Id, FirstName, LastName FROM Table WHERE CancelDate IS NULL

      另一种方法是拥有一个全局历史表(其中包含您的所有历史数据)。这种表的结构通常看起来像

      Id bigint not null,
      TableName nvarchar(50),
      ColumnName nvarchar(50),
      PKColumnName nvarchar(50),
      PKValue bigint, //or whatever datatype
      OriginalValue nvarchar(max),
      NewValue nvarchar(max),
      ChangeDate datetime
      

      然后您在您的表上设置一个触发器(或者,添加一个您的所有更新/插入也将插入到您的 HX 表中的策略),以便记录正确的数据。

      【讨论】:

      • 我已经完成了第二个解决方案的实现,效果很好。确保将归档表上的索引保持在较轻的状态,以便更快地插入。我还会添加数据类型列。
      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2011-06-17
      • 2018-08-08
      • 2011-05-06
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多