【发布时间】:2011-03-27 07:20:17
【问题描述】:
任何人都见过每条记录有多个版本的表格示例
如果你有桌子的话
Person(Id, FirstName, LastName)
并且您更改记录的姓氏而不是两个版本的姓氏(第一个版本和更改后的版本)
【问题讨论】:
标签: sql
任何人都见过每条记录有多个版本的表格示例
如果你有桌子的话
Person(Id, FirstName, LastName)
并且您更改记录的姓氏而不是两个版本的姓氏(第一个版本和更改后的版本)
【问题讨论】:
标签: sql
我们这样做的方式(可能不是最好的方式)是拥有一个活动位字段,以及一个返回父记录的外键。因此,对于一般查询,您可以过滤在职员工,但您可以通过员工 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
【讨论】:
我已经看到了这两种方法。第一个是通过添加EffectiveDate 和CancelDate(或类似的)在表本身中。要获取给定记录的当前值,您可以执行以下操作: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 表中的策略),以便记录正确的数据。
【讨论】: