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

时间:2011-01-01 12:14:22

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

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

CREATE TABLE MemberLastChanged
(
   memberID 
   memberName
   dateEntered
);

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

例如,当前信息为:

  

memberID:5534
memberName:james

用户将其更改为:

  

memberID:5534
memberName:   标记

到目前为止,“会员”将保留当前值:

5534并标记

“MemberLastChanged”将成立:

5534和james


如何使用触发器在t-sql中实现此目的?

3 个答案:

答案 0 :(得分:4)

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与DELETED)来过滤掉虚拟更新。

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

答案 1 :(得分:3)

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

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

请参阅this关于使用这些逻辑表的MDSN文章。

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

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

答案 2 :(得分:2)

您希望在用户表格上设置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属性是否已更新;如果是这样,具有旧值的行(Deleted触发器内UPDATE伪表中可用的行)将插入MemberLastChanged