Имя таблицы SQL Server, начинающееся с # в пользовательской базе данных, а не в базе данных tempdb, а не во временной таблице

13

Каким-то образом десятилетия назад в нашей базе данных была создана таблица, которая начинается с #. Он отображается в обозревателе объектов в базе данных приложения, а не в tempdb. По какой-то причине Azure не будет импортировать базу данных таким образом.

Мы не можем отбросить его, переименовать или взаимодействовать с ним. Я пытался удалить из Object Explorer, Script Drop , Rename из графического интерфейса, и ни один из них не работал.

Мы находимся на SQL 2008 R2.

drop table [*app*].[dbo]."#OBSOLETE";

Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not 
have permission.

exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could be found in the current database '*app*', given that @itemtype was input as '(null)'.

Как убить этот объект, чтобы мы могли перенести его в Azure?

что это парень
источник
4
Попробуйте поставить скобки вокруг имени таблицы, тот же ответ?
rvsc48
1
Можете ли вы попробовать использовать функцию QUOTENAME, если решение @ rvsc48 этого не делает (хотя, думаю, так и будет). docs.microsoft.com/en-us/sql/t-sql/functions/…
MguerraTorres
1
Скобки: тот же ответ.
что это парень
1
Пожалуйста , запустите следующий запрос в БД , содержащей эту таблицу и вставьте вывод в вопрос: SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. Благодарю.
Соломон Руцкий
2
Другой вариант (который у меня нет времени для тестирования): 1) Получить object_idиз этой таблицы. 2) Перезапустите экземпляр в однопользовательском режиме. 3) подключиться через выделенное соединение администратора. 4) В этой БД попробуйте что-то вроде UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}. Стоит выстрел ..
Соломон Руцкий

Ответы:

16

Данный:

  1. sp_rename использует имена объектов вместо идентификаторов объектов,
  2. мы не можем использовать имя объекта, так как оно начинается с «а» #и интерпретируется как имеющее особое значение и обрабатывается по-другому,
  3. все остальные варианты исчерпаны

Вы должны попробовать отредактировать основную таблицу системного каталога напрямую через Dedicated Admin Console (DAC) :

  1. Получить object_idиз этой таблицы.
  2. Перезапустите экземпляр в однопользовательском режиме. Это необходимо для непосредственного обновления системных таблиц (т.е. не требуется для использования соединения DAC).
  3. Подключение через выделенную консоль администратора. Это можно сделать в интерактивном сеансе SQLCMD, выполнив в окне командной строки следующую команду:

    C:\> SQLCMD -A -E

    или подключитесь напрямую к БД, используя:

    C:\> SQLCMD -A -E -d {database_name}
  4. В этой БД попробуйте что-то вроде следующего:

    UPDATE sys.objects$ {enter}
    SET [name] = N'obsolete' {enter}
    WHERE [object_id] = {ye_olde_object_id}; {enter}
    GO {enter}

    Он не выполнит инструкцию, пока вы не введете GO {enter}.

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

  • Как и модели данных, которые мы создаем, существуют вероятные правила и рабочие процессы для того, как работают вещи, о которых мы не знаем (например, денормализация, «бизнес» правила, регулирующие состояние данных в различных таблицах и т. Д.)
  • Вполне вероятно, что прямое редактирование аннулирует ответственность Microsoft за помощь, если у вас возникнут проблемы и у вас есть контракт на поддержку (я не видел условий соглашения (-ов) о поддержке, но мне трудно поверить, что такого языка не будет в там)

    @ Пол Рэндал подтвердил в комментарии к моему связанному ответу : «ручное редактирование системной таблицы безвозвратно устанавливает флаг на загрузочной странице базы данных, который помечает вашу базу данных как отредактированную таким образом, и CSS может решить не помогать вы, если у вас впоследствии возникнут проблемы с этой базой данных. "

Соломон Руцкий
источник
4
Мне нравится ответ, но, возможно, стоит добавить предложение о том, почему это так опасно делать?
Джо Оббиш
@JoeObbish Спасибо, и хорошее предложение. Я постараюсь добавить что-то завтра.
Соломон Руцкий
2
@JoeObbish Я только что добавил что-то. Этого достаточно?
Соломон Руцкий