假设我有两个表,一个“实时”表和一个历史表。实时表如下所示:
CREATE TABLE dbo.LiveTable (
LiveTableId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
SomeVarChar VARCHAR(20) NOT NULL DEFAULT '',
SomeForeignId INT NULL,
OtherForeingId INT NULL,
ChangeBy VARCHAR(128) NOT NULL,
ChangeTime DATETIME NOT NULL DEFAULT GETDATE()
)
历史表看起来一样,除了它有自己的主键和在IsDelete
别处使用的列。当用户更新 中的一行时LiveTable
,我想在历史表中记录该行的先前值。当然,这很简单,只需一个UPDATE
触发器。但我刚刚确定我的一些更新没有触发历史表插入,我相信这是由于允许空值的字段。我的触发器看起来像这样:
CREATE TRIGGER dbo.trgLiveTableUpdate ON dbo.LiveTable FOR UPDATE
AS
INSERT INTO dbo.LiveTableHistory (
LiveTableId,
SomeVarChar,
SomeForeignId,
OtherForeignId,
ChangeBy,
ChangeTime
)
SELECT
d.LiveTableId,
d.SomeVarChar,
d.SomeForeignId,
d.OtherForeignId,
d.ChangeBy,
d.ChangeTime
FROM DELETED d
JOIN INSERTED i ON d.LiveTableId = i.LiveTableId
WHERE d.SomeVarChar <> i.SomeVarChar
OR d.SomeForeignId <> i.SomeForeignId //<--- I don't think this works
OR d.OtherForeignId <> i.OtherForeignId //<--- this either
是否有可能我的WHERE
条件没有遇到更改的情况,SomeForeignId
或者OtherForeignId
因为这些列都允许空值?如果是这样,我将如何编写一个在检查这些列是否不相等时考虑空值的条件?