SSIS только извлекает изменения Delta - PullRequest
0 голосов
/ 25 сентября 2019

После некоторого совета.Я использую SSIS \ SQL Server 2014. У меня есть ночной пакет служб SSIS, который извлекает данные из баз данных, отличных от SQL Server, в одну таблицу (таблица SQL заранее обрезается каждый раз), а затем извлекаю из этой таблицы, чтобы создатьфайл csv за день.

В дальнейшем я хочу лишь ежедневно извлекать в csv записи, которые изменились, т. е. Deltas.

Каков наилучший подход?Я думал об использовании CDC в SSIS, но так как я усекаю таблицу SQL перед начальной загрузкой каждый раз, будет ли это лучшим методом?Или мне нужно будет иметь основную таблицу в SQL с начальной загрузкой, затем импортировать в другую таблицу и просто извлечь, где есть другие?Для информации, таблица в SQL содержит первичный ключ.

Я просто хочу перепроверить, поскольку CDC предполагает, что все таблицы находятся в SQL Server, тогда как мои данные сначала поступают из-за пределов SQL Server.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 25 сентября 2019

Первичный ключ на этой таблице - ваша отсрочка.Очевидно, что база данных SQL Server, в которую вы переносите разрозненные данные, не будет знать от одной таблицы к следующей, какие записи изменились, но если вы добавите две дополнительные таблицы и измените существующую таблицу с помощью дополнительного столбца,он должен быть в состоянии понять это, используя HASHBYTES .

В этом примере я назову новую таблицу SentRows, но вы можете использовать более значимое имя на практике.Мы назовем новый столбец в старой таблице HashValue.

Добавьте столбец HashValue к вашей таблице как тип данных varbinary.NOT NULL.

Создайте таблицу SentRows со столбцами для всех столбцов первичного ключа основной таблицы, плюс столбец HashValue.

Создание таблицы RowsToSendэто структурно идентично вашей основной таблице, включая HashValue.

. Измените ваши запросы, чтобы создать HashValue, применив HASHBYTES ко всем неключевым столбцам в таблице.(Это будет ужасно утомительно. Извините.)

Отправьте полный набор данных.

Теперь переместите все значения ключей и HashValue s в таблицу SentRows.Обрежьте основную таблицу.

При следующем извлечении сравните значения ключей и HashValue s с SentRows с новыми данными в основной таблице.

Соответствие первичного ключа + совпадение хэша = строка без изменений

Соответствие первичного ключа + несоответствие хэша = Обновленная строка

Первичный ключ во входящих данных, но отсутствует в существующем наборе данных= Новая строка

Первичный ключ не во входящих данных, а в существующем наборе данных = Удаленная строка

Извлеките все изменения, которые необходимо отправить в таблицу 'RowsToSend`.

Отправьте изменения из RowsToSend.

Переместите значения ключей и HashValue s в таблицу SentRows.Обновите хэши для измененных значений ключей, вставьте новые строки и решите, как вы собираетесь обрабатывать удаления, если вам приходится иметь дело с удалениями.

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

Если вы хотите (и вы поблагодарите себя позже, если вы это сделаете), добавьте вычисляемый столбец в таблицу SentRows со значением по умолчанию GETDATE(), которое сообщит вам, когда была добавлена ​​строка.

И понеслось.С тех пор ничего, кроме дельт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...