Отслеживание изменений, внесенных в запись, и получение версии записи в данный момент времени в SQL Server. - PullRequest
0 голосов
/ 04 апреля 2019

Мне нужно отслеживать изменения, внесенные в запись и способные получить любую версию записи в данный момент времени.

Учтите, у меня есть следующая таблица контактов.

--------------------------
| contact                |
--------------------------
| id                     |
| name                   |
| phone                  |
| email                  |
| city                   |
| country                |
| create_by              |
| created_at             |
--------------------------

Я хочу добиться следующих вещей в таблице выше.

  1. Я хочу отслеживать все изменения, внесенные в записи за это время.
  2. Я хочу найти версию записи в данный момент времени.
  3. Исходная запись должна оставаться без изменений (* без обновления).

Например,

Итак, я создал следующую таблицу для отслеживания всех изменений.

--------------------------
| contact_history        |
--------------------------
| contact_id             |
| field_name             |
| old_value              |
| new_value              |
| modified_by            |
| modified_at            |
--------------------------

С этой моделью данных,

  1. Чтобы создать новую запись контакта, мы создадим запись в таблице контактов.
  2. Чтобы обновить запись, мы создадим новую запись в записи 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.

1 Ответ

0 голосов
/ 04 апреля 2019

Simple.Используйте запрос TOP 1, чтобы получить самую последнюю запись до даты, которую вы хотите отфильтровать.

К сожалению, из-за выбранной вами модели данных вам потребуется выполнить подзапрос TOP 1.для каждого поля в вашем наборе результатов, которое может быть в вашей таблице истории.

SELECT id, 
(SELECT TOP 1 new_value ... WHERE field_name='Name' ... ) AS Name,
etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...