Симптоми
Обмислете следния сценарий:
-
Имате две таблици с разделители в Microsoft SQL Server 2014 и преградите на първата таблица се съпоставят с различни файлове и filegroups с помощта на една и съща схема и функция за деление.
-
Можете да смените един от тези дялове към втората таблица, а след това да съкратите втората таблица.
-
Можете да пускате файлове и filegroups, които са нанесени към разменения дял.
-
Изпълнявате команда SELECT във втората таблица.
В този случай получавате следното съобщение за грешка:
MSG 606, ниво 21, състояние 1Metadata несъответствие. ИД на Filegroup<Filegroup ид> зададено за таблица <име на таблица> не съществува. Изпълнение на DBCC CHECKDB или CHECKCATALOG.
Когато изпълнявате DBCC CHECKDB/CHECKTABLE, получавате следното съобщение за грешка:
Не можете да обработвате индекс <IndexName> на таблица <TableName> тъй като filegroup (filegroup ИД <FileGroupNumber>) е невалиден.
Решение
Първоначално проблемът е коригиран в следните кумулативни актуализации на SQL Server:
Всяка нова сборна актуализация за SQL Server съдържа всички поправки и всички корекции на защитата, които са били включени в предишната сборна актуализация. Препоръчваме ви да изтеглите и инсталирате последните сборни актуализации за SQL Server:
Забележка Тази корекция предотвратява само бъдещи случаи на този проблем. Ако вече имате този проблем, експортирайте данните си в нова база данни, без да се налага да въвеждате повреда в метаданните. За да направите това, изпълнете следните стъпки:
-
За да определите дали даден дял има невалиден filegroup, изпълнете следната заявка, за да видите дали връща резултат:
SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)
-
Направете таблицата с повредата на метаданните отново видима. Ако заявката от стъпка 1 връща резултат, дялът с повредени метаданни не ви позволява да преглеждате (изберете * от) всички редове в таблицата. За да заобиколите този проблем, премахнете този грешен дял.Забележка Лошият дял трябва да е празен. В противен случай файловете и filegroup, с които е бил, не са могли да бъдат отхвърлени или изтрити. За да направите това, пренесете този дял в друга таблица, която използва същата схема за разделяне. Тази таблица може да бъде само сляпа таблица. Използвайте container_id от заявката в стъпка 1 и я съгласувате с partition_id от системни. прегради. (Уверете се, че сте отбелязали partition_number.) Използвайте partition_number, за да извършите смяна на ДЯЛА за таблица от таблицата, която е невиждана за таблицата на фиктивните. Таблицата на фиктивните трябва да има един и същ набор от колони и да използва същата схема за деление. Вашата заявка за намиране на несъгласувания дял може да прилича на следното:
SELECT au.container_id, au.data_space_id, p.partition_number FROM sys.partitions AS p JOIN sys.allocation_units AS au ON p.partition_id = au.container_id LEFT JOIN sys.filegroups AS fgs ON fgs.data_space_id = au.data_space_id WHERE object_id = OBJECT_ID('MyTableName') AND fgs.data_space_id IS NULL;
-
Копирайте данните от непреглежданата по-рано таблица в новата база данни.
Състоянието
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са посочени в секцията "важи за".