Мне нужно отслеживать изменения, внесенные в запись и способные получить любую версию записи в данный момент времени.
Учтите, у меня есть следующая таблица контактов.
--------------------------
| contact |
--------------------------
| id |
| name |
| phone |
| email |
| city |
| country |
| create_by |
| created_at |
--------------------------
Я хочу добиться следующих вещей в таблице выше.
- Я хочу отслеживать все изменения, внесенные в записи за это время.
- Я хочу найти версию записи в данный момент времени.
- Исходная запись должна оставаться без изменений (* без обновления).
Например,
Итак, я создал следующую таблицу для отслеживания всех изменений.
--------------------------
| contact_history |
--------------------------
| contact_id |
| field_name |
| old_value |
| new_value |
| modified_by |
| modified_at |
--------------------------
С этой моделью данных,
- Чтобы создать новую запись контакта, мы создадим запись в таблице контактов.
- Чтобы обновить запись, мы создадим новую запись в записи contact_history с именем поля, новым значением, текущим временем и тем, кто изменил запись.
Таким образом, я могу отслеживать, какие изменения были внесены и кто их сделал, и в то же время исходная запись останется без изменений.
То, чего я пытаюсь добиться, - это найти версию всех записей контактов в данный момент времени.
Например, рассмотрим следующую запись.
Contact table
------------------------------------------------------------------------------------------------
| id | name | phone | email | city | country | created_by | created_at |
------------------------------------------------------------------------------------------------
| 1 | Steve | 1111111 | steve@abc.com | NY | USA | John | 2019-04-01 13:17:49.417 |
------------------------------------------------------------------------------------------------
Каждое обновление будет создаваться как запись истории в таблице contact_history.
contact_history
-------------------------------------------------------------------------------------------------------
| contact_id | field_name | old_value | new_value | modified_at | modified_by |
-------------------------------------------------------------------------------------------------------
| 1 | email | steve@abc.com | steve@changed.com | 2019-04-02 08:19:49.213 | Arnold |
| 2 | city | NY | LA | 2019-04-03 12:48:37.568 | John |
| 3 | city | LA | SF | 2019-04-04 25:25:19.715 | John |
-------------------------------------------------------------------------------------------------------
Когда мне понадобится версия записи контакта до 2019-04-02, я смогу получить следующее:
------------------------------------------------------------------------------------------------
| id | name | phone | email | city | country | created_by | created_at |
------------------------------------------------------------------------------------------------
| 1 | Steve | 1111111 | steve@abc.com | NY | USA | John | 2019-04-01 13:17:49.417 |
------------------------------------------------------------------------------------------------
Когда мне нужна версия записи контакта до 2019-04-03, я должен получить следующее:
----------------------------------------------------------------------------------------------------
| id | name | phone | email | city | country | created_by | created_at |
----------------------------------------------------------------------------------------------------
| 1 | Steve | 1111111 | steve@changed.com | NY | USA | John | 2019-04-01 13:17:49.417 |
----------------------------------------------------------------------------------------------------
Когда я хотел получить последнюю версию той же записи, которую я должен был получить,
----------------------------------------------------------------------------------------------------
| id | name | phone | email | city | country | created_by | created_at |
----------------------------------------------------------------------------------------------------
| 1 | Steve | 1111111 | steve@changed.com | SF | USA | John | 2019-04-01 13:17:49.417 |
----------------------------------------------------------------------------------------------------
Пример приведен только для одной записи. Может применяться для нескольких записей контактов.
Как написать эффективный запрос для достижения этого в SQL Server.