UPDATE が呼び出されたときに特定のテーブルに加えられた変更の履歴を保持する必要がありますが、特定の列のみを気にします。
したがって、履歴テーブルを作成しました。
CREATE TABLE [dbo].[SourceTable_History](
[SourceTable_HistoryID] [int] IDENTITY(1,1) NOT NULL,
[SourceTableID] [int] NOT NULL,
[EventDate] [date] NOT NULL,
[EventUser] [date] NOT NULL,
[ChangedColumn] VARCHAR(50) NOT NULL,
[PreviousValue] VARCHAR(100) NULL,
[NewValue] VARCHAR(100) NULL
CONSTRAINT pk_SourceTable_History PRIMARY KEY ([SourceTable_HistoryID]),
CONSTRAINT fk_SourceTable_HistoryID_History_Source FOREIGN KEY ([SourceTableID]) REFERENCES SourceTable (SourceTableId)
)
私の計画は、SourceTable に Update トリガーを作成することです。ビジネスは特定の列の変更のみを気にするので、疑似コードでは、次のようなことを計画していました
If source.Start <> new.start
Insert into history (PrimaryKey, EventDate, EventUser, ColumnName, OldValue, NewValue)
(PK, GETDATYE(), updateuser, "StartDate", old.value, new.value)
そして、履歴が必要な列ごとにそのようなブロックがあります。
CDC を使用することは許可されていないため、独自に展開する必要があり、これが今のところ私の計画です。
これは適切な計画だと思いますか?
監視する必要があるテーブルは 7 つあり、列数はテーブルごとに 2 ~ 5 列です。
特定の列の前後の値を最初に比較してから新しい行を書き込むトリガーを取得する方法を考え出す必要があります。
私はそれが次のような単純なものだと思った:
CREATE TRIGGER tr_PersonInCareSupportNeeds_History
ON PersonInCareSupportNeeds
FOR UPDATE
AS
BEGIN
IF(inserted.StartDate <> deleted.StartDate)
BEGIN
INSERT INTO [dbo].[PersonInCareSupportNeeds_History]
([PersonInCareSupportNeedsID], [EventDate], [EventUser], [ChangedColumn], [PreviousValue], [NewValue])
VALUES
(inserted.[PersonInCareSupportNeedsID], GETDATE(), [LastUpdateUser], 'StartDate', deleted.[StartDate], deleted.[StartDate])
END
END