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中实现此目的?
答案 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 - 触发器可以访问两个逻辑表,这些逻辑表的结构与它们所定义的表具有相同的结构:
请参阅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