我正在从事的最近项目的要求之一是,维护数据库表数据的历史记录作为审计跟踪的一部分。我最初对技术解决方案的想法是使用触发器,但经过一些研究,我了解了SQL Server时态表(核心SQL Server 2016的一部分)。我对此进行了大量研究,发现可以很好地使用时态表。
有关时态表的更多信息:Managing Temporal Table History in SQL Server 2016
但是,我希望仅在更改几列时才创建时态表中的数据。
CREATE TABLE dbo.Persons
(
ID BIGINT IDENTITY(1,1) NOT NULL,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50),
PhoneNumber NVARCHAR(20)
)
现在,如果我在此表上创建时态表(SYSTEM_VERSIONING = On),我希望仅当更改电话号码而不是名字和姓氏时,才将数据插入到时态表中。
答案 0 :(得分:1)
不幸的是,这不是它的工作方式。就像您帖子中的链接所说的那样,“系统版本控制是全有还是全无”。老实说,您的第一个直觉可能是您的最佳选择-进行此操作的所有其他方法(CDC,复制,系统版本控制..)将捕获比您想要的更多的数据,并且您必须在事后减少结果。
如果您确实要使用系统版本控制,则只需使用提供的链接中提供的选项之一:删除不需要的行和/或将不需要的列更新为NULL值。
我建议您使用第一个本能,并使用触发器来实现类似类型4缓慢变化的维度。这是获取所需特定数据的最直接方法。
答案 1 :(得分:0)
您可以为您想要历史的属性创建一个表(并且您将设置 {{1}}),并为您不想要历史的属性创建第二个表。在这两个表之间,您将拥有 1 对 1 的关系。