代码之家  ›  专栏  ›  技术社区  ›  Craig

在行中存储一列或多列的历史记录

  •  0
  • Craig  · 技术社区  · 4 年前

    我请求在表中存储特定字段更改的日期。例如,在mydbo.User表中,我们需要知道IsActive标志是何时更改的。有历史。

    我提议:

    1. 新模式-历史记录。

    2. 新表-[History].User\u History

        CREATE TABLE [History].User_History (
          Id INT NOT NUL IDENTITY(1,1), <-- PK
          UserId INT NOT NULL, <-- FK to User.Id
          CaptureDate DATETIME DEFAULT(GETUTCDATE()),
          PrivacyId INT NULL
        )
    

    PrivacyId(或添加的任何列)将为NULL,因为我们可能会添加新列,而现有行需要保留为NULL,因为我们当时不知道该值)

    我们所有的更新和插入都是通过存储过程(是的,我知道…)

    所以这两个过程需要检查PrivacyId的新值是否会改变。如果是,请在\u History表中写入新行。

    我们没有选择使用CDC。所以看来我们必须找到一个更手动的方法来实现这一点。我提出的解决方案合适吗?还是有障碍或更好的方法来实现这一点?

    1 回复  |  直到 4 年前
        1
  •  1
  •   Dale K    4 年前

    您的解决方案看起来不错,因为您正在使用存储过程执行这些操作。另外,您的历史记录表看起来非常简单。也许你可以添加,什么样的操作(插入,更新)和谁做了更改。

    CaptureDate DATETIME DEFAULT(GETUTCDATE()),
    OperationType VARCHAR(10) NOT NULL,
    PerformedByUser VARCHAR(30) NOT NULL
    

    Temporal tables