Лучший подход для интеграции данных между двумя базами данных SQL? - PullRequest
1 голос
/ 14 июня 2009

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

Какие основные подходы для этого вы бы предложили?

Эти данные не являются сверхчувствительными или нуждаются в корпоративном решении.

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

Спасибо

Ответы [ 5 ]

3 голосов
/ 14 июня 2009

Есть куча вариантов. 2 довольно простых решения для реализации:

  1. Вы можете использовать SSIS (Sql Server Integration Services) для передачи данных в и из источников данных
  2. Вы также можете использовать SQL Server Replication и настроить сценарий издателя / подписчика.
1 голос
/ 14 июня 2009

Ваши параметры в некоторой степени зависят от вида используемого SQL Server. Но точные требования вашей интеграции имеют большее значение. Самый простой и наименее эффективный метод для односторонней интеграции - удалить каждое событие календаря из цели перед загрузкой новых из источника. Это может быть достаточно, если не так много событий для синхронизации, например, если вам вообще не нужно загружать прошедшие события. Но если вам нужно отслеживать состояние синхронизации, все усложняется, и инструменты начинают иметь значение. Этот вид интеграции состоит из двух этапов:

  1. Извлечение измененных данных из источника и
  2. Преобразование и загрузка данных в пункт назначения

Извлечение изменений

В каждой версии SQL2008 имеется новая функция отслеживания изменений , которая специально предназначена для сценариев синхронизации. Отслеживание изменений отличается от сбора данных изменений, который поддерживается только в SQL 2008 Enterprise Edition. Если исходная база данных работает под управлением SQL 2008, я бы сначала посмотрел отслеживание изменений. Основное преимущество заключается в том, что вам не нужно настраивать метаданные для обработки обнаружения изменений, например сохранять временную метку последней загрузки и сравнивать ее с временными метками изменения событий и т. Д. Вам не нужно вносить какие-либо изменения DDL для своего пользователя. таблицы для отслеживания изменений, кроме включения отслеживания изменений:

ALTER DATABASE AdventureWorks2000 SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
GO
USE AdventureWorks2000;
GO
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING
  WITH (TRACK_COLUMNS_UPDATED = ON);
GO

Если вы не можете использовать отслеживание изменений, я бы предложил использовать временные метки или номера версий вместо заполнения отдельной таблицы изменений триггерами. Триггеры могли бы сократить его здесь, но я все же рекомендую избегать их :) Возможно, у вас уже есть необходимые временные метки в схеме базы данных.

Настройка репликации является интересным методом сбора данных об изменениях. Фактически, технически это предшественник для CDC, найденный в SQL2008 Enterprise Edition. Я сам не использовал репликацию для CDC, но, например, в этой книге авторы имеют хороший опыт ее использования.

Преобразование и загрузка

Использование агента SQL для планирования пакета служб SSIS. Если вы можете выполнять полную загрузку каждый раз вместо загрузки изменений, это все, что вам нужно.

Другой вариант - запланировать хранимую процедуру, но обработка таких вещей, как ошибки журналирования, не будет такой простой. Мой опыт показывает, что разработка пакетов служб SSIS выполняется намного быстрее, чем при использовании T-SQL, особенно если будут задействованы связанные серверы.

Проблемы с SQL Server Express

SQL Server Express (2005/2008) не имеет агента SQL и может действовать только как подписчик репликации . Я обычно заканчивал тем, что программировал службу Windows для заданий интеграции SQL Express, но наличие внешнего планировщика для запуска хранимых процедур могло бы просто работать достаточно хорошо. Написание и планирование хранимой процедуры, вероятно, будет намного быстрее, чем разработка службы.

SQL Server Express 2008 действительно имеет время выполнения служб SSIS, но я точно не знаю, насколько он ограничен, поскольку не все функции поддерживаются им. Однако мастер импорта / экспорта работает.

1 голос
/ 14 июня 2009

Добавьте связанный сервер к другому серверу, и вы можете запросить его, например:

select * from [LinkedServer].dbname.dbo.Table

Таким образом, вы всегда будете использовать текущую информацию, и вам не нужно писать скрипт или хранимую процедуру, которая определяет, «что нового» или «какие строки изменились».

1 голос
/ 14 июня 2009

Я согласен с Коди, у 1 и 2 его ответа есть смысл. Хотя, может быть, немного сложнее для вашей цели

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

Похоже, что это может быть возможным для вас, либо запустить SP в коде, вручную или настроить запланированное задание в агенте сервера SQL

http://msdn.microsoft.com/en-us/library/aa213778(SQL.80).aspx

1 голос
/ 14 июня 2009

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

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

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