使用触发器和表跟踪数据更改

时间:2015-05-16 03:45:24

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

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

创建我们正在跟踪的表格的重复表格,其中包含一些额外的列:

那么,主表(一个例子)

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
)

然后我们在主表上为Updates创建一个触发器,并为Inserts创建一个触发器。

如果是更新,则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)

1 个答案:

答案 0 :(得分:0)

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

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

许多开发人员喜欢触发器方法,因为它对管理它们意味着更少,而且很容易理解。如果该表具有大量插入/更新/删除,请使用CDC。否则,触发就足够了。