Ім'я таблиці SQL Server, починаючи з # в базі даних користувача, а не в tempdb, не в таблиці temp


13

Якось десятиліття тому в нашій базі даних була створена таблиця, яка починається з #. Він відображається в Провіднику об’єктів у базі даних програми, а не в tempdb. Чомусь Azure не імпортує подібну базу даних.

Ми не можемо скинути його, перейменувати його або взаємодіяти з ним. Я спробував « Видалити» з Object Explorer, Script Drop , Перейменувати з графічного інтерфейсу, і жоден з них не працював.

Ми на 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. всі інші варіанти вичерпані

Спробуйте відредагувати базову таблицю системного каталогу безпосередньо через з'єднання виділеної консолі адміністратора (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, щоб допомогти вам, якщо у вас виникли проблеми та у вас є договір про підтримку (я не бачив умов Угоди про підтримку, але мені важко повірити, що такої мови не буде там)

    @Paul Randal підтвердив у коментарі до пов'язаної моєї відповіді: "вручну редагуючи системну таблицю безповоротно встановлюється прапор на завантажувальній сторінці бази даних, який позначає вашу базу даних як редаговану таким чином, і CSS може вирішити не допомогти ви, якщо згодом у вас виникнуть проблеми з цією базою даних. "


4
Мені подобається відповідь, але, можливо, варто додати речення, чому це так небезпечно робити?
Джо Оббіш

@JoeObbish Дякую та добру пропозицію. Я спробую додати щось завтра.
Соломон Руцький

2
@JoeObbish Я просто щось додав. Це достатньо?
Соломон Руцький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.