【发布时间】:2014-12-11 08:29:19
【问题描述】:
我有一个数据库表,它使用渐变维度的数据仓库概念来跟踪旧版本。 所以,我用Log Trigger机制实现了它。
我的桌子是这样的:
CREATE TABLE "T_MyTable" (
"Id" INT NOT NULL DEFAULT NULL,
"Description" NVARCHAR(255) NULL DEFAULT NULL )
我创建了一个 hystory 表
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)
现在,我的问题是:我的客户实际上会按 date only(即没有一天中的时间)查询历史记录表,因此我需要获取该日期的记录版本。 我想了两个选择:
将触发器(如何?)更改为每个日期只记录一个“历史”记录。
-
保持触发器不变,记录数据库中的所有变化(包括日期和时间),然后查询历史表以获取特定日期的最新版本(如何?)
我的感觉是第二个选项更容易实现,否则触发器可能会变得复杂(插入或更新,取决于当前日期的历史记录的存在)。
在选择正确的方向时我需要一些帮助,并且我想在所选选项中提供所需的 SQL 查询示例。
【问题讨论】:
标签: sql sql-server scd