Сбор данных изменений SQL Server - это функция, которая считывает исторические данные из журналов транзакций SQL Server и сохраняет их в специальной таблице.
Благодаря использованию специальных функций табличных значений (TVF) он позволяет пользователю запрашивать эти данные, делая возможным либо получить все изменения в конкретной таблице, либо только чистые изменения, которые произошли в результате изменений в течение определенного времени.
CDC имеет определенные преимущества
- Его можно настроить для отслеживания только определенных таблиц или столбцов.
- Он способен обрабатывать изменения модели в определенной степени.
- Это не влияет на производительность так сильно, как триггеры, потому что он работает с журналами транзакций.
- Он легко включается / отключается и не требует дополнительных столбцов в таблице, которые должны отслеживаться.
У этого также есть некоторые недостатки:
- Количество исторических данных может стать огромным быстро.
- Вы не можете отследить, кто внес изменения (по крайней мере, для удалений).
- Данные истории требуют некоторого времени, чтобы наверстать упущенное, поскольку они основаны на журналах транзакций.
- Это зависит от агента SQL Server. Если агент не работает или аварийно завершает работу, история не отслеживается.
Я много читал о CDC, и хотя теперь я знаю, как его использовать, я все еще не уверен, является ли это правильным инструментом для меня.
- Для каких задач / сценариев CDC является правильным инструментом? (Например, разрешить пользователям восстанавливать объект данных до определенного момента времени? Аудит? Отображение полной истории данных?)
- Когда вам лучше не использовать CDC, а прибегнуть к индивидуальному триггерному решению?
- Можно ли использовать CDC в оперативной базе данных и использовать данные CDC в оперативном приложении? (например, показывать его конечному пользователю) Или это явно неправильное использование этой функции?
Я часто слышу, что CDC является инструментом аудита, но разве для этого не предназначен SQL Server Audit ? Они оба разные инструменты для одной и той же задачи? Или CDC может использоваться для других вещей?
Мой текущий сценарий состоит в том, что меня просят создать надежную структуру данных, которая должна стать основой для нескольких будущих приложений. Точные требования размыты, но одно из них заключается в том, что он должен иметь возможность отслеживать историю данных и восстанавливать более старые записи вместе со всеми связанными данными из других таблиц. Сейчас я оцениваю CDC как вариант, но не уверен, стоит ли идти этим путем, потому что я не могу найти ни одного рекомендованного варианта использования.
Хотя я ценю советы для моего конкретного сценария, ответы должны давать общие советы о том, когда и когда не следует использовать сбор данных изменений.
источник
Ответы:
Во-первых,
Таким образом, это может решить для вас, не будут ли у ваших клиентов корпоративные выпуски, или вы еще не знаете, будете ли вы использовать корпоративные выпуски. (Поскольку спецификация включает «несколько будущих приложений», это может стать для вас реальной проблемой)
В отличие от триггеров, это не в режиме реального времени, это одновременно и преимущество, и недостаток. Использование триггеров всегда замедляет обновление.
Я работал над одной системой, когда мы использовали триггеры (сгенерированные CodeSmith), а также отслеживали все изменения в записях, мы также связывали изменения вместе с «исторической» таблицей, которая включала модуль приложения, которое внесло изменения, и элемент пользовательского интерфейса, который пользователь использовал для внесения изменений.
Однако вам лучше всего решить эту проблему на уровне приложения, например, записав все обновления в очередь сообщений, которая затем воспроизводится для создания базы данных в любой данный момент времени, см. Временные шаблоны в блоге Martin Flowler для хорошего обзора вариантов.
источник
Вот очень хорошо написанная серия из 9 частей, в которой рассматриваются различные способы аудита изменений данных SQL Server. Части 3, 4 и 5 посвящены CDC. Стоит прочитать все статьи, потому что это ответит на ваши вопросы, например, различные сценарии, в которых функции будут подходящими и накладными. http://solutioncenter.apexsql.com/tag/methods-for-auditing-sql-server
источник
Может быть, это зависит.
Да.
Да.
Когда данные в таблице изменений не соответствуют вашим потребностям.
Да.
Нет, это не злоупотребление этой функцией.
Да.
Нет.
CDC можно использовать для других целей.
Существует отслеживание изменений и сбор данных изменений. Оба имеют свои корни в репликации.
Отслеживание изменений предоставляет способ обеспечить чистые изменения в таблице. Примером использования может быть синхронизация устройства.
CDC, с другой стороны, отслеживает каждое небольшое изменение, историю. Можно использовать эту историю для обновления хранилища данных вместо массового копирования в данные, или можно использовать эту историю в качестве самих данных и создавать на их основе отчеты. Таблица изменений не скрыта и не имеет какой-то странной схемы или чего-то еще. Вы можете запросить его и использовать данные по своему усмотрению. Просто имейте в виду ... это не в реальном времени, как сказал Ян. Данные поступают из журнала транзакций, поэтому позаботьтесь о них, как если бы вы использовали репликацию, зеркалирование или доставку журналов. По большому счету, это будет быстрее, чем триггеры. Вам нужно будет использовать Snapshot Isolation, что связано с накладными расходами, и вам придется подумать о Disaster Recovery.
источник
Точка коррекции. Одно время сбор данных об изменениях был доступен только в перечисленных выше версиях. Однако сбор данных об изменениях стал доступен в стандартной редакции начиная с пакета обновления 1 (SP1) 2016 года. Таким образом, многие статьи, написанные до 2016 SP1, звучат так, как будто CDC недоступен для тех из нас, кто использует стандартную версию. Это больше не так. Документ Microsoft с изложением доступных CDC находится по ссылке ниже.
https://docs.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2016?view=sql-server-2017#DW
источник