古いバージョンを追跡するために、ゆっくりと変化するディメンションのデータ ウェアハウジングの概念を使用するデータベース テーブルがあります。そこで、Log Triggerメカニズムで実装しました。
私のテーブルは次のようなものです:
CREATE TABLE "T_MyTable" (
"Id" INT NOT NULL DEFAULT NULL,
"Description" NVARCHAR(255) NULL DEFAULT NULL )
履歴表を作成しました
CREATE TABLE "T_MyTableHistory" (
"Id" INT NOT NULL DEFAULT NULL,
"Description" NVARCHAR(255) NULL DEFAULT NULL,
StartDate DATETIME,
EndDate DATETIME )
次に、このようなトリガーを使用して、履歴を取得します。
CREATE TRIGGER TableTrigger ON T_MyTable FOR DELETE, INSERT, UPDATE AS
DECLARE @NOW DATETIME
SET @NOW = CURRENT_TIMESTAMP
UPDATE T_MyTableHistory
SET EndDate = @now
FROM T_MyTableHistory, DELETED
WHERE T_MyTableHistory.Id = DELETED.Id
AND T_MyTableHistory.EndDate IS NULL
INSERT INTO T_MyTableHistory (Id, Description, StartDate, EndDate)
SELECT Id, Description, @NOW, NULL
FROM INSERTED
そして、履歴テーブルを照会するには、次を使用します
SELECT Id, Description
FROM T_MyTableHistory
WHERE @DATE >= StartDate
AND (@DATE < EndDate OR EndDate IS NULL)
さて、私の質問は次のとおりです。私の顧客は実際には日付のみで(つまり、時刻なしで) 履歴テーブルを照会するので、その日付のレコード バージョンを取得する必要があります。私は2つのオプションについて考えました:
トリガーを変更して (どのように?)、日付ごとに 1 つの「履歴」レコードのみを記録します。
トリガーをそのままにして、データベース内のすべての変更 (日付と時刻を含む) を記録しますが、履歴テーブルにクエリを実行して、特定の日付の最新バージョンを取得します (どのように?)
私の感じでは、2 番目のオプションの方が実装が簡単です。そうしないと、トリガーが複雑になる可能性があります (現在の日付の履歴レコードの存在に応じて、INSERT または UPDATE)。
正しい方向を選択する際に助けが必要であり、選択したオプションで必要な SQL クエリの例を示したいと思います。