【问题标题】:How to Create Trigger to Keep Track of Last Changed Data如何创建触发器以跟踪上次更改的数据
【发布时间】:2011-06-02 05:17:39
【问题描述】:
CREATE TABLE Member
(
    memberID - PK
    memberName
    dateRegistered - one time process
);

CREATE TABLE MemberLastChanged
(
   memberID 
   memberName
   dateEntered
);

如果用户有任何机会更改其成员名称,我需要在历史记录表中跟踪当前更改的成员名称。

例如,当前信息是:

memberID:5534
memberName:james

用户将其更改为:

会员ID:5534
会员名: 标记

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

5534 和标记

“MemberLastChanged”将保持:

5534 和詹姆斯


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

【问题讨论】:

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:
CREATE TRIGGER TRG_Member_U ON Member FOR UPDATE
AS
SET NOCOUNT ON

INSERT MemberLastChanged (memberID, memberName)
SELECT
   D.memberID, D.memberName
FROM
   DELETED D JOIN INSERTED I ON D.memberID = I.memberID
WHERE
   D.memberName <> I.memberName
GO

另外,将默认的 GETDATE 添加到 dateRegistered 以便自动记录。

这还通过比较新旧值(INSERTED vs DELETED)过滤掉虚拟更新。

INSERTED 和 DELETED 是仅在触发器中可用的特殊表。

【讨论】:

    【解决方案2】:

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

    • INSERTED,这是要进入表的新数据
    • DELETED,这是表中的旧数据

    请参阅thisMDSN 文章,了解如何使用这些逻辑表。

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

    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
    

    【讨论】:

    • 我刚刚取消了“FOR”,代码运行良好。我选择了你的,因为没有我认为在重负载性能(如果有的话)方面会更快的条件......如果我对性能有误,请通知我。干杯
    • @user311509:如果您有许多虚拟更新并且客户端没有捕获此问题,您将拥有一个包含无用数据的海量历史表。有趣的是,您在遇到问题之前已经优化...
    【解决方案3】:

    您希望在您的用户表上有一个 AFTER UPDATE 触发器 - 类似于:

    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
    

    基本上,此触发器检查memberName 属性是否已更新;如果是这样,则将包含旧值的行(在 UPDATE 触发器内的 Deleted 伪表中可用)插入到 MemberLastChanged

    【讨论】:

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