在sql server 2008数据库中,我有一组表,我想定期保存历史记录。为此,我创建了另一组表来存储此历史记录。基本上,数据库结构如下所示:
+---------------+ +---------------+
| TableA | | TableAHistory |
+---------------+ +---------------+
| Key |<--+ | Key |<----+
| DataA | | | Date | |
| | | | DataA | |
+---------------+ | +---------------+ |
| |
+---------------+ | +-----------------+ |
| TableB | | | TableBHistory | |
+---------------+ | +-----------------+ |
| Key | | | Key | |
| TableAKey |---+ | TableAHistoryKey|---+
| DataB | | DataB |
+---------------+ +-----------------+
使用这种结构,我在创建可以将当前数据复制到历史表中的存储过程时遇到问题。我可以轻松创建将TableA中的数据复制到TableAHistory中的insert语句,但复制TableB的数据会导致我出现问题。将数据复制到TableBHistory时,我看不出如何找到TableAHistoryKey应该是什么。以下是插入语句的内容:
INSERT TableAHistory([Date], DataA)
SELECT CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE())),
DataA
FROM TableA
INSERT TableBHistory([TableAHistoryKey], DataB)
SELECT ??? AS TableAHistoryKey,
DataB
FROM TableB
我唯一能想到的是在历史表上添加一个字段来临时存储相应表的密钥。然后我可以在第二个插入语句中加入TableA,TableAHistory和TableB,让我访问正确的TableAHistoryKey。我宁愿不这样做,因为这个添加的列只会用于复制数据。
还有其他(常见)方法吗?
修改:为了增加一点清晰度,生成了TableAHistory中的Key
,与TableA中的Key
不同。 TableBHistory和TableB也是如此。
修改:目前,此历史记录只需按月保存,我们制定了一个会议,将“月/年”存储为该月第一天的日期。因此奇怪CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE()))
。可能不是最好的方法,但它确实有效。
答案 0 :(得分:4)
我希望你的归档表使用与prod相同的模式,但是在每个表中引入一个archiveID作为PK的一部分,包括tableBHistory。
然后,从特定存档集恢复行应该很容易。
答案 1 :(得分:2)
我原本以为对于历史表,您需要复制数据的日期。如果是这种情况,则代替两个历史表的(可能是生成的)密钥,复制原始密钥,然后在历史表中使用密钥加上日期的复合主键。