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中实现这一点?您可以创建一个触发器-触发器可以访问两个逻辑表,这两个逻辑表的结构与其定义的表相同:
- 插入,这是要放入表中的新数据
- 已删除,即表中的旧数据
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:如果您有许多虚拟更新,而客户端没有捕获这些更新,那么您将有一个包含无用数据的大量历史记录表。有趣的是,在出现问题之前,您已经在进行优化…可能重复