Как я могу регулярно копировать данные из одного набора таблиц в другой набор таблиц - PullRequest
2 голосов
/ 20 января 2011

В базе данных sql server 2008 у меня есть набор таблиц, в которых я хочу регулярно сохранять историю.Для этого я создал еще один набор таблиц для хранения этой истории.По сути, структура базы данных выглядит следующим образом:

+---------------+                +---------------+
| TableA        |                | TableAHistory |
+---------------+                +---------------+
| Key           |<--+            | Key           |<----+
| DataA         |   |            | Date          |     |
|               |   |            | DataA         |     |
+---------------+   |            +---------------+     |
                    |                                  |
+---------------+   |            +-----------------+   |
| TableB        |   |            | TableBHistory   |   |
+---------------+   |            +-----------------+   |
| Key           |   |            | Key             |   |
| TableAKey     |---+            | TableAHistoryKey|---+
| DataB         |                | DataB           |
+---------------+                +-----------------+    

С этой структурой у меня возникают проблемы при создании хранимой процедуры, которая может копировать текущие данные в таблицы истории.Я могу легко создать оператор вставки, который копирует данные из TableA в TableAHistory, но копирование данных 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.Я бы предпочел не делать этого, так как этот добавленный столбец будет использоваться только для копирования данных.

Есть ли другой (общий) способ сделать это?

Редактировать : Просто чтобы добавить немного ясности, Key в TableAHistory генерируется и не совпадает с Key в TableA.То же самое касается TableBHistory и TableB.

Редактировать : В настоящее время эту историю нужно сохранять только ежемесячно, и у нас есть соглашение для хранения «месяц / год»в качестве даты в первый день месяца.Отсюда странный CONVERT(DATE, DATEADD(DAY, 1 - DAY(GETDATE()), GETDATE())).Вероятно, не лучший способ сделать это, но это работает.

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Я бы хотел, чтобы ваши архивные таблицы использовали ту же схему, что и prod, но в каждом из таблиц, включая tableBHistory, добавили параметр archiveID как часть PK.

Тогда будет легко восстановить строки из определенного набора архивов.

2 голосов
/ 20 января 2011

Я бы подумал, что для таблицы истории вам понадобится дата, когда данные были скопированы.Если это так, то вместо (предположительно сгенерированного) ключа для двух таблиц истории скопируйте исходный ключ, а затем в таблицах истории используйте составной первичный ключ ключа плюс дата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...