2011-12-20 4 views
7

He utilizado esta secuencia de comandos por accidente en la base de datos 'maestra' en lugar de una base de datos temporal.Se borraron accidentalmente todos los datos en la base de datos 'maestra'

sp_msforeachtable 'delete from ?' 

¿Ha causado algún daño? Si es así, ¿cómo puedo restaurar los datos?

+3

Restaure su copia de seguridad más reciente del DB maestro. Usted tiene uno, ¿verdad? –

+0

No tengo uno. Es un DB de desarrollo personal sin datos críticos, así que lo peor que puede pasar es que tengo que volver a instalar SQL Server. – Stijn

+0

SQL Server Studio, ¿verdad? –

Respuesta

10

No, no debería haber eliminado nada (suponiendo que no tenga tablas de usuario en master).

Prueba

exec sys.sp_MSforeachtable 'select ''?''' 

no devuelve nada para mí. Por lo tanto, parece excluir las tablas del sistema como spt_values.

Editar: En efecto En cuanto a la definición del procedimiento que no sólo incluyen mesas donde OBJECTPROPERTY(o.id, N'IsUserTable') = 1

+0

Pensé lo contrario, pero creo que Martin puede estar en lo cierto. +1. – JonH

+0

Woah! ¡Gracias! Pensé que había volado mi base de datos y estaba listo para hacer una reinstalación. Esto es lo que sucede cuando no se comprueba si la base de datos que desea está seleccionada en el menú desplegable de Sql Server Studio. Por qué Microsoft? ¿Por qué no podría pedirle a alguien que explícitamente elija una base de datos antes de abrir la ventana de consulta? Gracias a Dios pusieron en la condición IsUserTable. La usabilidad ciertamente no es una de las características de Microsoft. –

+0

Su respuesta es útil y tranquilizadora, pero la cláusula 'OBJECTPROPERTY' no es lo que salvó a Stijn de una reinstalación. Después de cometer el mismo error descubrí algunas cosas interesantes sobre la implementación del procedimiento. Consulte [mi respuesta] (http://stackoverflow.com/a/12530893/111424) para ver un ejemplo. –

5

Martin Smith es correcto decir que sp_MSforeachtable no borra las tablas del sistema.

Sin embargo, aunque podemos pensar en tablas como spt_values y MSreplication_options como tablas del sistema, en realidad son tablas de usuario de acuerdo con SQL Server.

Cuando funciono con esta pregunta en mi base de datos maestra:

SELECT name, OBJECTPROPERTY(object_id, N'IsUserTable') AS IsUserTable 
FROM master.sys.tables; 

veo el siguiente conjunto de resultados:

name     IsUserTable 
--------------------- ----------- 
spt_fallback_db  1 
spt_fallback_dev  1 
spt_fallback_usg  1 
spt_monitor   1 
MSreplication_options 1 

Entonces, ¿cómo se Stijn salvados de una reinstalación?

Si nos fijamos en cómo se implementa sp_MSforeachtable, verá que hace algo como esto para seleccionar las tablas a caer:

declare @mscat nvarchar(12) 
select @mscat = ltrim(str(convert(int, 0x0002))) 

SELECT * 
from dbo.sysobjects o join sys.all_objects syso on o.id = syso.object_id 
where OBJECTPROPERTY(o.id, N'IsUserTable') = 1 and o.category & @mscat = 0; 

En mi base de datos maestra, este devuelve un conjunto de resultados vacío.

La cláusula where aplica una máscara de bits a la columna category de la tabla sysobjects para excluir las tablas que no son 'mscat'.

Por lo tanto, las tablas en la base de datos maestra están protegidas, no porque sean tablas del sistema, sino porque son tablas 'Microsoft'.

Este uso de la columna de la categoría es completamente indocumentado en Books Online Todo lo que tiene es una vaga descripción:

utilizado para la publicación, las limitaciones y la identidad.

Pero la tabla sysobjects está obsoleta de todos modos, por lo que no debería usarla. :)

Una consulta equivalente utilizando la vista apoyado sys.tables se vería así:

SELECT * 
FROM sys.tables 
WHERE is_ms_shipped = 0; 

En mi base de datos maestra, esto también devuelve un conjunto de resultados vacío.

+0

+1 Buena corrección. –

Cuestiones relacionadas