Итак, мы начали исследовать использование сбора данных об изменениях в одной из наших производственных баз данных. Мы хотели бы знать дату и время каждого изменения. Читая пошаговые руководства, учебные пособия и т. Д., Кажется, что стандартный подход заключается в использовании LSN для связи с cdc.lsn_time_mapping
системной таблицей. Этот подход работает, но он не очень прост и не эффективен, когда речь идет о сотнях тысяч изменений в день.
В тестовой среде я внес следующие изменения в таблицы отслеживания изменений. Я выпустил ALTER TABLE
оператор для добавления столбца в конец [__ChangeDateTime]
и сделал его значением по умолчанию GetDate()
. Подход, кажется, работает, отслеживание изменений все еще работает нормально, дата и время фиксируются. Но возиться с системными таблицами заставляет меня немного нервничать.
Если это не системное поле, которое Microsoft добавила с самого начала, у них должны были быть свои причины. Так как они вместо этого выбрали LSN для подхода cdc.lsn_time_mapping, я настраиваю себя на проблемы, создавая свой собственный взлом таким образом?
ОБНОВИТЬ:
Во время тестирования было обнаружено, что GetDate () порой не является достаточно точным для наших нужд - несколько изменений делятся одновременно. Рекомендуется использовать sysdatetime () и datetime2 для перемещения значения в наносекунду. Вариант на 2008+ только очевидно.
Единственное предостережение, которое я хотел бы дать, это то, что эти таблицы удаляются автоматически, когда CDC отключен. Столбец не будет воссоздан автоматически при повторном включении
источник