Ошибка при копировании проверочного ограничения с помощью DTS
-
03-07-2019 - |
Вопрос
У меня есть пакет DTS, который вызывает ошибку при выполнении задачи «Копировать объекты SQL Server».Задача копирует таблицу и данные с одного сервера SQL Server 2000 SP4 на другой (той же версии) и выдает ошибку:-
Не удалось найти ограничение CHECK для «dbo.MyTableName», хотя таблица помечена как имеющая такое ограничение.
В исходной таблице определено одно проверочное ограничение, которое, по-видимому, является причиной проблемы.После запуска пакета DTS все работает правильно: таблица, все ограничения и данные созданы на целевом сервере?Но возникает ошибка, приведенная выше, из-за которой последующие шаги не выполняются.
Есть идеи, почему возникает эта ошибка?
Решение
Это указывает на то, что метаданные в таблицах sys не синхронизированы с вашей фактической схемой.Если вы не видите никаких других признаков более общего повреждения, перестройте таблицу, скопировав ее в другую таблицу (выберите * в новую таблицу из старой таблицы), удалив старую таблицу, а затем переименовав новую и заменив ограничения. помощь.Это похоже на то, как Менеджер предприятия для 2000 делает что-то, когда вы вставляете столбец, который не находится в конце таблицы, поэтому вставка нового столбца в середину таблицы, а затем удаление приведет к тому же результату, если вы не не хочу вручную писать запросы.
Я был бы несколько обеспокоен состоянием базы данных в целом, если бы вы увидели другие случаи ошибок такого рода.(Я предполагаю, что вы уже выполнили команды CHECKDB и ошибка не устранена...)
Другие советы
Эта ошибка возникла, когда в существующую таблицу был добавлен новый столбец (с проверочным ограничением).Для расследования у меня есть:-
- Скопировал таблицу на другой целевой SQL-сервер и получил ту же ошибку.
- Создал новую таблицу с точно такой же структурой, но с другим именем и скопировал без ошибок.
- Удалил и заново создал проверочное ограничение для проблемной таблицы, но все равно получаю ту же ошибку.
- Контрольная таблица dbcc («MyTableName») с ALL_ERRORMSGS не выдает ошибок.
- dbcc checkdb в исходной и целевой базе данных не выдает ошибок.
Интересно, что пакет DTS выглядит следующим образом:-
- Скопируйте таблицу.
- Скопируйте данные.
- Создайте ограничения
Поскольку время создания проверочного ограничения составляет 7 минут после времени создания таблицы, т.е.он создает проверочное ограничение ПОСЛЕ перемещения данных.Это имеет смысл, поскольку ему не нужно проверять данные во время копирования, что предположительно повышает производительность.
Как предполагает Годеке, я думаю, что что-то повреждено в системных таблицах, поскольку работает новая таблица с теми же столбцами.Даже если операторы DBCC не выдают ошибок?