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.
Ripristina il backup più recente del DB master. Ne hai uno, giusto? –
Non ne ho uno. Si tratta di un DB di sviluppo personale senza dati critici, quindi è possibile che sia necessario reinstallare SQL Server. – Stijn
SQL Server Studio, giusto? –