我有一个使用缓慢变化维度的数据仓库概念来跟踪旧版本的数据库表。所以,我用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)
现在,我的问题是:我的客户实际上只会按日期查询历史记录表(即没有一天中的时间),所以我需要获取那个日期的记录版本。我想到了两个选择:
更改触发器(如何?)每个日期只记录一个“历史”记录。
保持触发器原样,记录数据库中的所有更改(包括日期和时间),然后查询历史表以获取特定日期的最新版本(如何?)
我的感觉是第二个选项更容易实现,否则触发器可能会变得复杂(插入或更新,取决于当前日期的历史记录的存在)。
我需要一些帮助来选择正确的方向,并且我想在所选选项中提供所需的 SQL 查询示例。