代码之家  ›  专栏  ›  技术社区  ›  Abe Miessler

SQL Server中的表历史触发器?

  •  5
  • Abe Miessler  · 技术社区  · 14 年前

    我想创建一个触发器,用插入的值以及更新前和更新后的值写入历史记录表。我还想包括尽可能多的关于帐户做更新的信息。如何在触发器中包含帐户信息?

    以下是我目前掌握的情况:

    CREATE TRIGGER [update_history] ON MyTable
    FOR UPDATE
    AS
    INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
    SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'BEFORE UPDATE', '???'
    FROM deleted
    
    INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
    SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'AFTER UPDATE', '???'
    FROM inserted
    

    我该用什么来代替'???'?

    3 回复  |  直到 9 年前
        1
  •  5
  •   Thomas    14 年前

    如果每个用户都有一个帐户,则可以使用 SYSTEM_USER 函数来确定当前用户。但是,如果您的所有连接都通过代理帐户(这在大多数网站设置中是典型的),则必须依赖传递给Update语句的正确用户标识:

    CREATE TRIGGER [update_history] ON MyTable
    FOR UPDATE
    AS
    INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
    SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'BEFORE UPDATE', inserted.userId
    FROM MyTable
        Join inserted
            On inserted.id = MyTable.id
    
    INSERT MyTable_History (id, BudgetNumber, PositionNumber, ModifiedDate, action, userId)
    SELECT id, BudgetNumber, PositionNumber, GETDATE(), 'AFTER UPDATE', userId
    FROM inserted
    
        2
  •  3
  •   Leigh josh poley    10 年前

    FWIW,如果您使用的是SQL Server 2008,有一个比编写触发器来跟踪数据更改更好的选择。看一看 Change Data Capture

        3
  •  0
  •   Community ƒernando Valle    7 年前

    使用 ORIGINAL_LOGIN()

    你可以在这里看到它的进一步定义 SQL Server - current user name