2011-12-20 8 views
7

Ho usato questo script per errore sul database "master" invece che su un database temporaneo.Accidentalmente cancellato tutti i dati nel database "master"

sp_msforeachtable 'delete from ?' 

Ha causato danni? In tal caso, come posso ripristinare i dati?

+3

Ripristina il backup più recente del DB master. Ne hai uno, giusto? –

+0

Non ne ho uno. Si tratta di un DB di sviluppo personale senza dati critici, quindi è possibile che sia necessario reinstallare SQL Server. – Stijn

+0

SQL Server Studio, giusto? –

risposta

10

No, non dovrebbe essere eliminato nulla (presupponendo che non ci siano tabelle utente in master).

Testing

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

non restituisce niente per me. Quindi sembra escludere le tabelle di sistema come spt_values.

Edit: In realtà Guardando la definizione della procedura che include solo le tabelle in cui OBJECTPROPERTY(o.id, N'IsUserTable') = 1

+0

Ho pensato diversamente ma penso che Martin potrebbe avere ragione. +1. – JonH

+0

Woah! Grazie! Pensavo di aver scaricato il mio database ed ero pronto per una reinstallazione. Questo è ciò che accade quando non si controlla se il database desiderato è selezionato nel menu a discesa in Sql Server Studio. Perché Microsoft? Perché non potresti chiedere a qualcuno di scegliere in modo esplicito un database prima di aprire la finestra della query? Grazie a Dio hanno inserito la condizione IsUserTable. L'usabilità non è certamente uno dei tratti distintivi di Microsoft. –

+0

La tua risposta è utile e rassicurante, ma la clausola 'OBJECTPROPERTY' non è quella che ha salvato Stijn da una reinstallazione. Dopo aver commesso lo stesso errore, ho scoperto alcune cose interessanti sull'implementazione della procedura. Per favore vedi [la mia risposta] (http://stackoverflow.com/a/12530893/111424) per un esempio. –

5

Martin Smith ha ragione a dire che sp_MSforeachtable non elimina le tabelle di sistema.

Tuttavia, sebbene possiamo pensare a tabelle come spt_values e come tabelle di sistema, in realtà sono tabelle utente in base a SQL Server.

Quando eseguo questa query nel mio database master:

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

vedo il set seguente risultato:

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

Così come è stato Stijn salvato da una reinstallazione?

Se si guarda a come sp_MSforeachtable è implementata, si vedrà che fa qualcosa di simile per selezionare le tabelle di cadere:

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; 

Nel mio database master, questo restituisce un set di risultati vuoto.

La clausola where applica una maschera di bit alla colonna category della tabella sysobjects per escludere tabelle che non siano "mscat".

Quindi le tabelle nel database master sono protette non perché sono tabelle di sistema, ma perché sono tabelle 'Microsoft'.

Questo uso della colonna categoria è completamente privi di documenti in Books Online Tutto quello che ha è una descrizione vaga:

utilizzare per la pubblicazione, i vincoli, e l'identità.

Ma la tabella sysobjects è tuttavia obsoleta, quindi non dovresti utilizzarla. :)

Una query equivalente utilizzando la visualizzazione supportata sys.tables sarebbe simile a questa:

SELECT * 
FROM sys.tables 
WHERE is_ms_shipped = 0; 

Nel mio database master, questo restituisce anche un set di risultati vuoto.

+0

+1 Buona correzione. –

Problemi correlati