Nazwa tabeli programu SQL Server rozpoczynająca się od # w bazie danych użytkowników, nie w tempdb, nie w tabeli tymczasowej

13

Jakiś dekad temu w naszej bazie danych utworzono tabelę zaczynającą się od #. Pokazuje się w Object Explorer w bazie danych aplikacji, a nie w tempdb. Z jakiegoś powodu Azure nie zaimportuje takiej bazy danych.

Nie możemy go upuścić, zmienić jego nazwy ani wchodzić w interakcje. Próbowałem usunąć z Object Explorer, Script Drop , Rename z GUI i żaden z nich nie działał.

Jesteśmy na 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)'.

Jak zabijamy ten obiekt, abyśmy mogli przeprowadzić migrację na platformę Azure?

ten facet
źródło
4
Spróbuj wstawić nawiasy wokół nazwy tabeli, ta sama odpowiedź?
rvsc48,
1
Czy możesz spróbować użyć funkcji QUOTENAME, jeśli rozwiązanie @ rvsc48 tego nie robi (chociaż myślę, że tak będzie). docs.microsoft.com/en-us/sql/t-sql/functions/…
MguerraTorres
1
Nawiasy: taka sama odpowiedź.
że facet
1
Proszę uruchomić następujące zapytanie w DB zawierający tę tabelę i wklej wyjście do pytania: SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. Dzięki.
Solomon Rutzky
2
Inna opcja (której nie mam czasu na testowanie): 1) Zdobądź object_idten stół. 2) Uruchom ponownie instancję w trybie pojedynczego użytkownika. 3) połącz za pomocą dedykowanego połączenia administracyjnego. 4) W tym DB spróbuj czegoś takiego UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}. Warto
spróbować

Odpowiedzi:

16

Dany:

  1. sp_rename używa nazw obiektów zamiast identyfikatorów obiektów,
  2. nie możemy użyć nazwy obiektu, ponieważ zaczyna się od #a, który jest interpretowany jako mający specjalne znaczenie i jest traktowany inaczej,
  3. wszystkie inne opcje zostały wyczerpane

Powinieneś spróbować edytować bazową tabelę katalogu systemowego bezpośrednio przez połączenie z dedykowaną konsolą administracyjną (DAC) :

  1. Zdobądź object_idten stół.
  2. Uruchom ponownie instancję w trybie pojedynczego użytkownika. Ma to na celu bezpośrednią aktualizację tabel systemowych (tj. Nie jest to wymagane do korzystania z połączenia DAC).
  3. Połącz przez dedykowane połączenie konsoli administracyjnej. Możesz to zrobić w interaktywnej sesji SQLCMD, uruchamiając następujące polecenie w oknie wiersza polecenia:

    C:\> SQLCMD -A -E

    lub połącz bezpośrednio z bazą danych za pomocą:

    C:\> SQLCMD -A -E -d {database_name}
  4. W tej bazie danych spróbuj czegoś takiego:

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

    Nie wykona instrukcji, dopóki nie wpiszesz GO {enter}.

Zachowaj ostrożność podczas bezpośredniej edycji tabel katalogu systemowego i nie przejmuj się pomysłem zrobienia tego. Jest to coś, co należy zrobić tylko wtedy, gdy nie ma absolutnie żadnego innego sposobu rozwiązania problemu (na przykład w tym przypadku). Prawdopodobnie istnieje kilka powodów, aby unikać dokonywania bezpośrednich edycji, ale dwa, które początkowo przychodzą na myśl, to:

  • Podobnie jak tworzone przez nas modele danych, istnieją prawdopodobne reguły i przepływy pracy dotyczące tego, jak działają rzeczy, o których nie jesteśmy świadomi (np. Denormalizacja, reguły „biznesowe” rządzące stanem danych w różnych tabelach itp.)
  • Całkiem prawdopodobne, że dokonywanie bezpośrednich edycji unieważnia odpowiedzialność Microsoft za pomoc, jeśli napotkasz problemy i masz umowę wsparcia (nie widziałem warunków umowy wsparcia, ale trudno mi uwierzyć, że taki język nie byłby w języku tam)

    @Paul Randal potwierdził w komentarzu do mojej pokrewnej odpowiedzi : „ręczne edytowanie tabeli systemowej nieodwołalnie ustawia flagę na stronie rozruchowej bazy danych, która oznacza, że ​​baza danych została edytowana w ten sposób, a CSS może zdecydować, że nie pomoże jeśli później wystąpią problemy z tą bazą danych ”.

Solomon Rutzky
źródło
4
Podoba mi się odpowiedź, ale może warto dodać zdanie, dlaczego jest to tak niebezpieczne?
Joe Obbish
@JoeObbish Dzięki i dobra sugestia. Spróbuję dodać coś jutro.
Solomon Rutzky
2
@JoeObbish Właśnie coś dodałem. Czy to wystarczy?
Solomon Rutzky