2014-02-14 3 views
-1

У нас есть база данных в MS SQL Server 2005 (фактически база данных разработки), в которой размещается множество реляционных таблиц, содержащих рабочее пространство приложения. Используя это приложение, пользователь может определить множество новых структур данных, каждый из которых хранится в виде строк в разных таблицах, а столбец с именем «финализированный» бит типа указывает, что набор данных скопирован в другую базу данных (которая действует с версией db с только завершенными данными), которая точно такая же схема с базой данных разработки.MS SQL Server Копирование реляционных данных между базами данных

По мере того как пользователь заканчивает свою работу, он начинает процесс синхронизации для набора данных (чье окончательное поле еще не установлено на 1) и после выполнения нескольких правил проверки, если все кажется ОК, мы скопируем это установите для выпуска базы данных и отметьте финализированное поле связанных таблиц как 1 в базе данных разработки. Есть ли простой механизм, который мы можем использовать, а не выбирать данные из первого db и вставлять его в целевое программное обеспечение? Слишком много таблиц для выбора, и эти таблицы фактически содержат реляционные данные, которые связаны с значениями id.

В выпуске db чаще всего видны таблицы из исходной базы данных с условием «где finalized = 1», но мы также должны добавить набор, когда пользователь начинает синхронизацию для набора данных, в то время как финализированное поле по-прежнему 0 (если процесс проверки правилен).

Заранее спасибо

ответ

0

SQL-скрипт (ХП) для продвижения этих новых записей таблицы, вероятно, лучшим вариантом в этом случае.

Некоторые варианты были бы:

Установка Dev идентичностей в производственные столы - что является рискованным, если данные могут быть вставлены с помощью любого другого метода. Также стоит учитывать блокировки таблиц, которые возникают при включении вставки идентификаторов - конечные пользователи, вероятно, не смогут запросить производственные таблицы во время работы. Это можно сделать при помощи синтаксиса:

SET IDENTITY_INSERT [myTABLE] ON 
INSERT INTO PROD.DBO.myTABLE (COL1,COL2,COL3) 
SELECT COL1,COL2,COL3 FROM DEV.DBO.myTABLE WHERE... 
SET IDENTITY_INSERT [myTABLE] OFF 

Здесь находится КБ. http://technet.microsoft.com/en-us/library/ms188059.aspx

Другим вариантом будет отфильтрованная репликация с dev на prod - опять же, это будет работать только в том случае, если нет других способов вставки данных в производство, а также содержит дополнительные факторы риска, если записи dev могут быть изменены после они отмечены как одобренные, так как изменения немедленно реплицируются в производство, что может повлиять на конечных пользователей. В этом случае ваши производственные таблицы НЕ МОЖЕТ быть модифицируемыми.

Вот KB на фильтрованной репликации: http://technet.microsoft.com/en-us/library/ms146925(v=sql.105).aspx

В идеале, производственная среда изолирована полностью из среды разработки - это означает варианты, которые я просто предложил не будет использоваться - но я представил их как FYIs ,

При этом, если ваша схема таблицы идентична, вы можете посмотреть на добавление нового столбца идентификации в процессе производства, что позволит вам вставить идентификатор dev вместе с ним.

т.е.

dev.dbo.myTable 
id int identity(1,1) primary key, 
val1 int, 
val2 int, 
flag bit 

prod.dbo.myTable 
newid int identity(1,1) primary key, -- new column in prod 
id int, 
val1 int, 
val2 int, 
flag bit 

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

Это позволит вам делать прямую вставку с dev на prod, сохраняя неповрежденный dev-id, а также одновременно предлагая метод сопоставления prod обратно в dev.

Надеюсь, это поможет.

Смежные вопросы