【发布时间】:2021-02-19 17:31:09
【问题描述】:
我有一个类似于以下的表结构:
CREATE TABLE Customer_Subscription
(
Customer_ID INT
, Product_ID INT
, Subscription_START DATETIME
, Subscription_END DATETIME
, PRIMARY KEY (Customer_ID, Product_ID)
)
然后,我还有一个审计表,如下所示:
CREATE TABLE Customer_Subscription_Audit
(
Audit_Code CHAR(1)
, AuditCreatedDateTime DATETIME
, Customer_ID INT
, Product_ID INT
, Subscription_START DATETIME
, Subscription_END DATETIME
)
每当对表 Customer_Subscription 进行更改时,我都有一个触发器,该触发器还会向 Audit 表写入一行,记录之前被更改的值(未修改的版本),其中 INSERT UPDATE DELETE 由 Audit_Code 表示我','U','D'
我有一个问题,我希望能够使用我的 Customer_Subscription_Audit 表在过去的任何给定时间点重新创建我的 Customer_Subscription 表中的内容,我想知道最好的方法是什么?
(只是为了让它工作,我目前正在考虑逐行遍历审计表......我知道 RBAR 很糟糕......但它应该可以完成工作......但我想看看是否有更有效的方式也是如此)
【问题讨论】:
-
我认为你应该改变你的逻辑。首先,在插入中没有“先前”值。因此,插入行包含当前状态。这与为更新记录的行非常不同。你的逻辑与自己竞争。如果您的插入行包含当前值,那么您的其他操作也应该这样做。为什么?因为对于任何修改,前一行都包含 当前 更改的前图像。 IOW,只需记录任何操作的当前值。
-
对于删除,给定行的值实际上并没有改变。您只是记录了一行被删除的事实,而您真正需要的只是 PK 值和删除标志。如前所述,请仔细考虑在给定日期和时间您打算如何解释此信息。您应该生成一些精心规划的测试数据和用例,以真正了解您应该使用什么逻辑。
标签: sql sql-server datetime where-clause greatest-n-per-group