Nombre de la tabla de SQL Server que comienza con # en la base de datos del usuario, no en tempdb, no en una tabla temporal

13

De alguna manera, hace décadas, se creó una tabla en nuestra base de datos que comienza con a #. Aparece en Object Explorer en la base de datos de la aplicación, no en tempdb. Por alguna razón, Azure no importará la base de datos de esta manera.

No podemos soltarlo, renombrarlo o interactuar con él. He intentado Eliminar del Object Explorer, Script Drop , Rename de la GUI y ninguno de ellos ha funcionado.

Estamos en 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)'.

¿Cómo matamos este objeto para que podamos migrarlo a Azure?

que es chico
fuente
44
Intenta poner corchetes alrededor del nombre de la tabla, ¿la misma respuesta?
rvsc48
1
¿Puede intentar usar la función QUOTENAME si la solución de @ rvsc48 no lo hace (aunque creo que lo hará)? docs.microsoft.com/en-us/sql/t-sql/functions/…
MguerraTorres
1
Paréntesis: misma respuesta.
Que chico
1
Por favor, ejecute la consulta siguiente en la base de datos que contiene esta tabla y pega el resultado en la cuestión: SELECT [name], CONVERT(VARBINARY(128), [name]) FROM sys.tables WHERE [name] = N'#OBSOLETE';. Gracias.
Solomon Rutzky el
2
Otra opción (que no tengo tiempo para probar): 1) Obtener el object_idde esa tabla. 2) Reinicie la instancia en modo de usuario único. 3) conectarse a través de una conexión de administrador dedicada. 4) En ese DB, intente algo como UPDATE sys.objects$ SET [name] =N'obsolete' WHERE [object_id] = {ye_olde_object_id}; {enter} GO {enter}. Vale la pena
intentarlo

Respuestas:

16

Dado:

  1. sp_rename usa nombres de objeto en lugar de ID de objeto,
  2. no podemos usar el nombre del objeto ya que comienza con a #y se interpreta que tiene un significado especial y se maneja de manera diferente,
  3. todas las demás opciones se han agotado

Debería intentar editar la tabla del catálogo del sistema subyacente directamente a través de una conexión de la Consola de administración dedicada (DAC) :

  1. Obtener el object_idde esa mesa.
  2. Reinicie la instancia en modo de usuario único. Esto es para poder actualizar directamente las tablas del sistema (es decir, no es un requisito para usar la conexión DAC).
  3. Conéctese mediante la conexión de la Consola de administración dedicada. Puede hacer esto en una sesión interactiva SQLCMD ejecutando lo siguiente en una ventana del símbolo del sistema:

    C:\> SQLCMD -A -E

    o, conéctese directamente a la base de datos usando:

    C:\> SQLCMD -A -E -d {database_name}
  4. En ese DB, intente algo como lo siguiente:

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

    No ejecutará la declaración hasta que ingrese el GO {enter}.

Tenga cuidado al editar directamente las tablas del catálogo del sistema y no se sienta demasiado cómodo con la idea de hacerlo. Esto es algo que debe hacerse solo si no hay absolutamente otra forma de solucionar un problema (como el caso aquí). Probablemente hay varias razones para evitar hacer ediciones directas, pero las dos que inicialmente vienen a la mente son:

  • Al igual que los modelos de datos que creamos, es probable que haya reglas y flujos de trabajo sobre cómo funcionan las cosas que desconocemos (por ejemplo, desnormalización, reglas "comerciales" que rigen el estado de los datos en varias tablas, etc.)
  • Es muy probable que realizar ediciones directas anule la responsabilidad de Microsoft de ayudarlo si tiene problemas y tiene un contrato de soporte (no he visto los términos de los acuerdos de Soporte, pero me cuesta creer que ese lenguaje no esté disponible) allí)

    @Paul Randal confirmó en un comentario sobre una respuesta mía relacionada : "editar manualmente una tabla del sistema establece irrevocablemente una marca en la página de inicio de la base de datos que marca su base de datos como editada de esta manera, y CSS podría decidir no ayudar si posteriormente tiene problemas con esa base de datos ".

Solomon Rutzky
fuente
44
Me gusta la respuesta, pero ¿quizás valga la pena agregar una oración sobre por qué es tan peligroso hacerlo?
Joe Obbish el
@JoeObbish Gracias, y buena sugerencia. Intentaré agregar algo mañana.
Solomon Rutzky
2
@JoeObbish Acabo de agregar algo. ¿Es eso suficiente?
Solomon Rutzky