Всем добрый день!

Спустя n-ое количество времени надоело вносить изменения в справочники вручную из одной системы в другую + апдейть файл констант / менять значения в процессах и т.п. (база MS SQL)

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

Вызов хранимки:
declare @txt varchar(max)
exec dbo.usp_SynchronizeDictionaries '2015-05-14', 'Terrasoft_Source', 'Terrasoft_Target', null, null, @txt output

1) '2015-05-14' –дата с какой нужно затащить изменения (обычно это дата, на которую снята копия базы)
2) 'Terrasoft_Source' – имя базы-источника
3) 'Terrasoft_Target' – имя целевой базы (можно добавить сервер типа [srv].Terrasoft_Target если есть linked server)
4) Null первый – можно задать имя конкретной одной таблицы (не обязательно, используется в рекурсии)
5) Null второй – строка имен таблиц в формате «;tbl_1;tbl_2;» (разделители ;) которые «Обработаны», т.е. которые не нужно трогать (не обязательно, используются в рекурсии)
6) @txt параметр для передачи списка таблиц в рекурсии

Суть работы хранимой процедуры:
1) пробегаем по всем таблицам, которые находятся в нужных группах (Справочники + у нас, например, еще 2 доп. группы.). В каждой таблице смотрим, есть ли внешние ключи (если есть, то нужно вначале провести манипуляции с таблицами, на которые они ссылаются). Для таблиц из внешних ключей хранимая процедуры вызывается рекурсивно. Есть защита от "зацикливания" (список обработанных таблиц) в случае если в справочниках есть перекрестные ссылки друг на друга. К счастью, у нас такого нет. + Если референсные таблицы не являются справочниками, их не трогаем.
2) для каждой таблицы вытаскиваем набор столбцов и формируем запросы на адпейт (для записей у которых ModifiedOn > даты из параметра запуска), запросы на вставку для новых записей (для которых CreatedOn > даты из параметра запуска)

Как результат получаем список команд (надеюсь, в нужной последовательности - см. примечание про внешние ключи). Для нашей системы вроде работает так, как и задумывалось.

TO-DO: можно контролировать, что в целевой системе не было апдейтов параметров начиная с даты, переданной в хранимку (чтобы случайно не перетереть настройки, сделанные на продакшене за это время вручную).

Текст процедуры прикрепил "as is", не обессудьте, прилизывать текст некогда... кому понадобится думаю легко сделает это + конечно же возможны улучшения, но на них тоже нет времени :)

Нравится

2 комментария

Здравствуйте!

Спасибо за полезный пример.

TO-DO: генерировать наименования столбцов нужно в скобках [] т.к. они могут совпадать со служебными словами... например одна из колонок у нас называлась Order, соотв. нужно чтобы скрипт генерировал t.[Order] = s.[Order]

Показать все комментарии