Sql 如何创建触发器以跟踪上次更改的数据

Sql 如何创建触发器以跟踪上次更改的数据,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,如果用户更改了其成员名称,我需要在历史记录表中跟踪当前更改的成员名称 CREATE TABLE Member ( memberID - PK memberName dateRegistered - one time process ); CREATE TABLE MemberLastChanged ( memberID memberName dateEntered ); 例如,当前信息为: 成员ID:5534成员名称:詹姆斯 用户将其更改为: 成员

如果用户更改了其成员名称,我需要在历史记录表中跟踪当前更改的成员名称

CREATE TABLE Member
(
    memberID - PK
    memberName
    dateRegistered - one time process
);

CREATE TABLE MemberLastChanged
(
   memberID 
   memberName
   dateEntered
);
例如,当前信息为:

成员ID:5534
成员名称:詹姆斯

用户将其更改为:

成员ID:5534
成员名称: 标记

现在,“成员”将保留当前值:

5534和马克

“MemberLastChanged”将保留:

5534和詹姆斯


如何使用触发器在t-sql中实现这一点?

您可以创建一个触发器-触发器可以访问两个逻辑表,这两个逻辑表的结构与其定义的表相同:

  • 插入,这是要放入表中的新数据
  • 已删除,即表中的旧数据
请参阅有关使用这些逻辑表的MDSN文章

使用这些数据,您可以填充历史记录表

CREATE TABLE Member
(
    memberID - PK
    memberName
    dateRegistered - one time process
);

CREATE TABLE MemberLastChanged
(
   memberID 
   memberName
   dateEntered
);

您希望在用户表上有一个更新后的
触发器,类似于:

CREATE TRIGGER trg_Member_MemberUpdate
ON dbo.Member AFTER UPDATE
AS
    INSERT INTO dbo.MemberLastChanged(memberID, memberName)
    SELECT d.MemberID, d.MemberName
    FROM DELETED d
基本上,此触发器检查
memberName
属性是否已更新;如果是,则将带有旧值的行(在
更新
触发器内的
已删除
伪表中可用)插入到
成员lastchanged
成员上创建触发器TRG成员以进行更新
CREATE TRIGGER trg_MemberUpdated
ON dbo.Member AFTER UPDATE 
AS BEGIN
   IF UPDATE(memberName)
      INSERT INTO 
          dbo.MemberLastChanged(memberID, memberName, dateEntered)
          SELECT
             d.MemberID, d.MemberName, GETDATE()
          FROM 
             Deleted d
END
作为 不计较 插入MemberLastChanged(memberID、memberName) 挑选 D.memberID,D.memberName 从…起 已删除的D联接已在D.memberID=I.memberID上插入I 哪里 D.memberName I.memberName 去
另外,将默认的GETDATE添加到dateRegistered,以便自动记录

这还通过比较新值和旧值(插入值与删除值)过滤出虚拟更新


“插入”和“删除”是仅在触发器中可用的特殊表。

我刚去掉了“FOR”,代码工作得非常好。我选择了你的,因为我认为没有条件在重载性能方面更快(如果有的话)。。。如果我对表演有错误,请告诉我。Cheers@user311509:如果您有许多虚拟更新,而客户端没有捕获这些更新,那么您将有一个包含无用数据的大量历史记录表。有趣的是,在出现问题之前,您已经在进行优化…可能重复