【问题标题】:Track data changes with trigger and table使用触发器和表格跟踪数据更改
【发布时间】:2015-05-21 05:57:04
【问题描述】:

目前,我们通过以下方式跟踪数据变化:

为我们正在跟踪的表创建一个重复表,并添加一些额外的列:

所以,主表(一个例子)

CREATE TABLE person
(
   personId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   personName VARCHAR(100) NOT NULL,
   personAge INT NOT NULL,
   CreateUserID INT NOT NULL,
   CreateDate DATETIME NOT NULL,
   UpdateUserID INT NULL,
   UpdateDate DATETIME NULL
)

然后,保存更新的表。

CREATE TABLE person_history
(
   person_history_id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
   actionType CHAR(1) NOT NULL,
   personId INT NOT NULL,
   personName VARCHAR(100) NOT NULL,
   personAge INT NOT NULL,
   CreateUserID INT NOT NULL,
   CreateDate DATETIME NOT NULL,
   UpdateUserID INT NULL,
   UpdateDate DATETIME NULL
)

然后我们在主表上为更新创建一个触发器,并为插入创建一个触发器。

如果是更新,则 ActionType 为 U,如果是插入,则为 I。然后我们只需将所有列复制到 History 表中。

这在 SQL server 2008 R2 上运行,另外,一个版本在 Azure 上运行。

管理员要求我们不要使用 SQL Server 的更改跟踪。我什至不确定 Azure 中是否自动提供更改跟踪。我从未使用过它,但是……值得调查并尝试出售管理员吗?

因为,我需要能够创建行来显示历史记录:

[User] inserted a new person on [Date]. 
[User] change the Age from 27 to 29 on the [Date] 
[User] change the Age from 29 to 32 and the Name from James to Peter on the [Date]

使用触发器和历史记录表是一种合适且推荐的方式,还是可以选择使用更改跟踪? (2008 R2 和 Azure)

【问题讨论】:

    标签: sql-server sql-server-2008 azure


    【解决方案1】:

    您想要的不是变更跟踪 (CT),而是变更数据捕获 (CDC),是的,Azure does support it。更改跟踪只是告诉您一行已更改。它不会告诉您更改了哪一列或旧值和新值是什么。

    触发器是同步调用的,这意味着所有 DML 语句(INSERTUPDATEDELETE)必须等待触发器完成。 CDC 根据 SQL Server 日志工作。在扫描日志之前有一个(可配置的)时间延迟,但它不会阻止 DML 语句。

    许多开发人员喜欢触发方法,因为这对他们来说意味着更少的管理并且易于理解。如果该表有大量插入/更新/删除,请使用 CDC。否则,一个触发器就足够了。

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多