Der Name der SQL Server-Tabelle beginnt mit # in der Benutzerdatenbank, nicht in tempdb, nicht in einer temporären Tabelle

13

Irgendwie wurde vor Jahrzehnten eine Tabelle in unserer Datenbank erstellt, die mit a beginnt #. Es wird im Objekt-Explorer unter der Datenbank der App angezeigt, nicht in tempdb. Aus irgendeinem Grund importiert Azure die Datenbank nicht wie folgt.

Wir können es nicht löschen, umbenennen oder damit interagieren. Ich habe versucht , Löschen von Objekt - Explorer Script - Tropfen , Umbenennen von der GUI und keiner von ihnen gearbeitet hat.

Wir arbeiten mit 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)'.

Wie töten wir dieses Objekt, damit wir es nach Azure migrieren können?

dass es Kerl
quelle
4
Versuchen Sie, den Tabellennamen in Klammern zu setzen, dieselbe Antwort?
rvsc48
1
Können Sie versuchen, die Funktion QUOTENAME zu verwenden, wenn die Lösung von @ rvsc48 dies nicht tut (obwohl ich denke, dass dies der Fall ist)? docs.microsoft.com/en-us/sql/t-sql/functions/…
MguerraTorres
1
Klammern: Gleiches Verhalten.
Dass es Kerl
1
Bitte führen Sie die folgende Abfrage in der DB in dieser Tabelle enthält , und die Ausgabe in der Frage einfügen: SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. Vielen Dank.
Solomon Rutzky
2
Eine andere Option (für die ich keine Zeit zum Testen habe): 1) Holen Sie sich die object_idvon dieser Tabelle. 2) Starten Sie die Instanz im Einzelbenutzermodus neu. 3) Stellen Sie eine Verbindung über eine dedizierte Administratorverbindung her.4) Versuchen Sie in dieser DB etwas wie UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}. Einen Schuss wert ..
Solomon Rutzky

Antworten:

16

Gegeben:

  1. sp_rename verwendet Objektnamen anstelle von Objekt-IDs,
  2. wir können den Objektnamen nicht verwenden, da er mit a beginnt #und dies als besondere Bedeutung interpretiert wird und anders behandelt wird,
  3. Alle anderen Möglichkeiten sind ausgeschöpft

Sie sollten versuchen, die zugrunde liegende Systemkatalogtabelle direkt über eine DAC-Verbindung (Dedicated Admin Console) zu bearbeiten :

  1. Holen Sie sich das object_idvon diesem Tisch.
  2. Starten Sie die Instanz im Einzelbenutzermodus neu. Dies soll in der Lage sein, die Systemtabellen direkt zu aktualisieren (dh keine Voraussetzung für die Verwendung der DAC-Verbindung).
  3. Stellen Sie eine Verbindung über die Dedicated Admin Console her. Sie können dies in einer interaktiven SQLCMD-Sitzung tun, indem Sie in einem Eingabeaufforderungsfenster Folgendes ausführen:

    C:\> SQLCMD -A -E

    Oder stellen Sie eine direkte Verbindung zur Datenbank her, indem Sie Folgendes verwenden:

    C:\> SQLCMD -A -E -d {database_name}
  4. Versuchen Sie in dieser Datenbank Folgendes:

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

    Die Anweisung wird erst ausgeführt, wenn Sie den Befehl eingeben GO {enter}.

Seien Sie bitte vorsichtig, wenn Sie Systemkatalogtabellen direkt bearbeiten, und machen Sie sich mit der Idee, dies zu tun, nicht allzu vertraut. Dies sollte nur getan werden , wenn es absolut keine andere Möglichkeit gibt, ein Problem zu beheben (wie hier).Es gibt wahrscheinlich mehrere Gründe, um direkte Bearbeitungen zu vermeiden, aber die beiden, die anfänglich in den Sinn kommen, sind:

  • Ähnlich wie bei den von uns erstellten Datenmodellen gibt es wahrscheinlich Regeln und Workflows für die Funktionsweise, die uns nicht bekannt sind (z. B. Denormalisierung, Geschäftsregeln für den Status von Daten in verschiedenen Tabellen usw.).
  • Wahrscheinlich macht es die Verantwortung von Microsoft zunichte, Sie zu unterstützen, wenn Sie auf Probleme stoßen und einen Supportvertrag haben (ich habe die Bedingungen der Supportvereinbarung (en) nicht gesehen, aber es fällt mir schwer, zu glauben, dass eine solche Sprache nicht zur Verfügung steht Dort)

    @Paul Randal bestätigte in einem Kommentar zu einer verwandten Antwort von mir: "Das manuelle Bearbeiten einer Systemtabelle setzt unwiderruflich ein Flag auf der Boot-Seite der Datenbank, das Ihre Datenbank als auf diese Weise bearbeitet markiert, und CSS entscheidet möglicherweise, keine Hilfe zu leisten Sie, wenn Sie später Probleme mit dieser Datenbank haben. "

Solomon Rutzky
quelle
4
Ich mag die Antwort, aber vielleicht lohnt es sich, einen Satz hinzuzufügen, warum dies so gefährlich ist?
Joe Obbish
@ JoeObbish Danke und guter Vorschlag. Ich werde versuchen, morgen etwas hinzuzufügen.
Solomon Rutzky
2
@ JoeObbish Ich habe gerade etwas hinzugefügt. Reicht das
Solomon Rutzky