Ошибка при копировании проверочного ограничения с использованием DTS - PullRequest
0 голосов
/ 16 октября 2008

У меня есть пакет DTS, который вызывает ошибку с задачей «Копировать объекты SQL Server». Задача - скопировать таблицу с данными с одного сервера SQL Server 2000 с пакетом обновления 4 (SP4) на другой (той же версии) и выдает ошибку: -

Не удалось найти ограничение CHECK для 'dbo.MyTableName', хотя таблица помечена как имеющая его.

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

Есть идеи, почему возникает эта ошибка?

Ответы [ 2 ]

2 голосов
/ 18 октября 2008

Это указывает на то, что метаданные в таблицах sys не синхронизированы с вашей фактической схемой. Если вы не видите никаких других признаков более общего повреждения, выполнение перестройки таблицы путем копирования ее в другую таблицу (выберите * в newtable from oldtable), удаление старой таблицы, а затем переименование новой и замена ограничений приведут к Помогите. Это похоже на то, как Enterprise Manager для 2000 делает что-то, когда вы вставляете столбец, который находится не в конце таблицы, поэтому вставка нового столбца в середину таблицы и последующее удаление приведет к тому же результату, если вы не хочу писать запросы вручную.

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

0 голосов
/ 20 октября 2008

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

  • Скопировал таблицу на другой целевой SQL Server и получил ту же ошибку.
  • Создана новая таблица с точно такой же структурой, но другим именем и скопирована без ошибок.
  • Отбросил и заново создал проверочное ограничение для таблицы проблем, но все равно получаю ту же ошибку.
  • Контрольная таблица dbcc ('MyTableName') с ALL_ERRORMSGS не выдает ошибок.
  • dbcc checkdb в исходной и целевой базе данных не выдает ошибок.

Интересно, что пакет DTS выглядит так: -

  • Скопируйте таблицу.
  • Копировать данные.
  • Создание ограничений

Поскольку время создания проверочного ограничения составляет 7 минут после времени создания таблицы, то есть оно создает проверочное ограничение ПОСЛЕ того, как данные были перемещены. Имеет смысл, поскольку нет необходимости проверять данные при копировании, что, вероятно, повышает производительность.

Как предполагает Годеке, я думаю, что что-то испортилось в системных таблицах, так как работает новая таблица с такими же столбцами. Даже если операторы DBCC не дают ошибок?

...