Копировать данные только между двумя базами данных - PullRequest
0 голосов
/ 11 ноября 2010

Я пытаюсь скопировать данные только между двумя базами данных SQL Server 2008. Мне нужно сохранить существующие хранимые процедуры и функции без изменений и копировать только данные. Схемы БД идентичны, но я сталкиваюсь с проблемами с ПК.

Я впервые попробовал:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'

Чтобы удалить все данные. Но получите

Failure inserting into the read-only column 

Итак, я попытался установить IDENTITY_INSERT ON для всех таблиц с помощью:

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable  'ALTER TABLE ? SET IDENTITY_INSERT ON'

без удачи.

Каков наилучший способ экспортировать данные только между двумя базами данных, оставив исходные процедуры и функции без изменений?

Спасибо.

Редактировать: я использую SQL Export для копирования данных из источника в место назначения. Мне нужно сохранить целевые базы данных, процедуры и функции, просто скопировать только данные.

Ответы [ 5 ]

2 голосов
/ 11 ноября 2010

Просто удалите идентификационные данные из всех ключей таблицы во второй базе данных.

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

В любом случае, вы не захотите, чтобы pkey был идентифицирующим pkey во втором БД, тогда все ваши внешние ключи не будут работать.

1 голос
/ 12 ноября 2010

Ошибка, которую вы получаете, не похожа на нарушение PK или проблему идентификации. Я вижу две возможные причины:

  1. Если вы получаете ошибку при попытке вставить данные, я бы проверил, есть ли в таблицах какие-либо вычисляемые столбцы . Многие программы не учитывают их при экспорте данных и включают вычисляемые столбцы в список вставляемых столбцов.

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

1 голос
/ 11 ноября 2010

Я, вероятно, подхожу к этому под другим углом: запишите все объекты через SQL Enterprise Manager в файл и запустите этот файл в пустой базе данных.Таким образом, у вас будут все метаданные, но нет реальных данных во второй базе данных, и вы сможете использовать их для дополнительных копий в будущем.

0 голосов
/ 12 ноября 2010

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

http://tenbulls.co.uk/2009/07/22/checking-your-constraints-to-check-your-integrity/

0 голосов
/ 12 ноября 2010

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

1) Я сделал полное резервное копирование базы данных, мне нужны были данные (в реальном времени)
2) Я восстановил эту резервную копию в моей временной базе данных.
3) Я написал сценарий для базы данных, из которой мне были нужны процедуры и функции, только для сценариев и процедур, используя DROP и IF INCLUDES.
4) Я запустил скрипт из # 3 для своей временной базы данных, содержащей данные из DB1, а также процедур и функций из DB2
5) Я восстановил DB2, используя OVERWRITE из резервной копии моей временной базы данных.

Спасибо, ребята, пометьте все как правильные, если бы я мог.

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