Подтвердить что ты не робот

Как восстановить историческое представление?

В настоящее время я изучаю Change Data Capture в качестве опции для хранения временных баз данных. Это здорово, потому что в нем хранятся только дельта и кажется, что он может решить мою проблему. Когда я включил CDC, в System Tables появилась группа таблиц.

При запросе cdc.dbo_MyTable я могу видеть все изменения, которые произошли в таблице. Теперь, как бы я построил историческое представление? Например, если бы я хотел видеть состояние моей таблицы на конкретную дату, как бы я это сделал? Возможно ли это?

Мне кажется, мне нужно взять журнал и начать применять его поверх моей оригинальной таблицы, но мне было интересно, есть ли встроенный способ сделать это. Какие-либо предложения?

Некоторые из вариантов использования, на которые я смотрю:

  • Знать состояние графика в определенный момент времени
  • Учитывая два графика в разное время, знайте множество ссылок, которые отличаются (это, вероятно, можно получить, используя предложение EXCEPT после построения таблиц)
4b9b3361

Ответ 1

это возможно, но не со встроенным способом, я боюсь. Вам нужно будет вручную отредактировать график.

Учитывая, что таблицы отслеживания изменений предлагают tran_end_time, то есть время, когда значение свойства должно восприниматься как сохраненное, вам нужно будет сделать запрос, который извлекает все отдельные периоды состояний таблицы, присоединяется к отслеживать изменения свойств и затем поворачивать (иметь представление в той же форме, что и таблица). Не забудьте объединиться с самим состоянием таблицы, чтобы получить значения, которые не были изменены/отслежены для полноты.

Конечный результат, упрощенный, должен выглядеть как

RN PK PropA   PropB   FromDate          ToDate
1  1  'Ver1'  'Ver1'  2012-01-01 09:00  2012-01-02 08:00
2  1  'Ver1'  'Ver2'  2012-01-02 08:00  2012-01-03 07:00
3  1  'Ver2'  'Ver2'  2012-01-03 07:00  *getdate()*
4  2  'Ver1'  'Ver1'  2012-01-01 05:00  2012-01-02 06:00
5  2  'Ver1'  'Ver2'  2012-01-02 06:00  2012-01-03 01:00
6  2  'Ver2'  'Ver2'  2012-01-03 01:00  *getdate()*

обратите внимание, что getdate() действителен, если строка не была удалена, и в этом случае она должна быть заменена датой удаления

EDIT, для двух вариантов использования. Первая точка легко адресована ему вопросом построения графика временных объектов, а затем фильтрацией:

declare @pointInTime datetime = '20120102 10:00';
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate

вторая точка может быть легко сгенерирована с предложением EXCEPT, как вы указываете. с учетом вышеуказанного запроса:

declare @pointInTimeA datetime = '20120102 10:00';
declare @pointInTimeB datetime = '20120103 01:00';
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate
EXCEPT
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate

но в предложении except представлены только строки, имеющие хотя бы одно значение столбца; я не знаю, действительно ли эта информация имеет смысл для человеческого глаза. В зависимости от ваших потребностей запрос, который работает непосредственно с данными cdc, может быть более уместным.

Ответ 2

Вы можете проверить моментальные снимки, которые были встроены в SQL Server с 2005 года.

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

Это дельта, поэтому Compared to a full copy of a database, however, snapshots are highly space efficient. A snapshot requires only enough storage for the pages that change during its lifetime. Generally, snapshots are kept for a limited time, so their size is not a major concern.

Ответ 3

Я не уверен в этом, никогда не делал ничего подобного, но, возможно, вы можете добавить столбец "changeet" в таблицу, которая может отслеживать изменения, которые у вас есть в таблице, каждый раз, когда транзакция получает max (changeet) и сохранить новые cahnges со следующим значением... Или если у вас есть отметка времени и вы хотите знать статус своей таблицы в определенное время, делайте запросы для фильтрации изменений до даты, которую вы хотите проверить... (Не уверен, что я должен написать это как ответ или комментарий... Я здесь новый)

В любом случае, надеюсь, что это поможет...