「ライブ」テーブルと履歴テーブルの2つのテーブルがあるとします。ライブテーブルは次のようになります。
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
もちろん、これはトリガーを使えば十分に簡単です。しかし、更新の一部が履歴テーブルの挿入を起動していないと判断したところです。これは、nullを許可するフィールドが原因であると考えています。私のトリガーは次のようになります。
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
変更がtoである状況、SomeForeignId
またはOtherForeignId
これらの列の両方でnullが許可されている状況で、私の条件がヒットしていない可能性はありますか?もしそうなら、それらの列の不平等をチェックするときにヌルを考慮に入れる条件をどのように書くのですか?