2009-11-30 12 views
12

So che fino ad ora (fino ad almeno MSSQL 2005), i database di sistema sono master, model, msdb e tempdb.SQL Server: come stabilire se un database è un database di sistema?

Il fatto è che, per quanto posso dire, questo non è garantito per essere conservato in futuro. E né la vista sys.databases né la vista sys.sysdatabases mi dicono se un database è considerato come un database di sistema.

C'è un luogo in cui è possibile ottenere queste informazioni (se un database è considerato un database di sistema o meno)?

risposta

16

Proprio tuffò Microsoft.SqlServer.Management.Smo.Database oggetto (che è fornito dalla stessa Microsoft!) Hanno semplicemente farlo usando seguente dichiarazione:

CAST(case when dtb.name in ('master','model','msdb','tempdb') 
    then 1 
    else dtb.is_distributor end AS bit) AS [IsSystemObject] 

In breve: se un database è denominato master, model, msdb o tempdb, è un sistema db; è anche un sistema db, se nel campo is_distributor = 1 nella vista sys.databases.

Spero che questo aiuti

Jimmy

+0

Jimmy ha rilevato ciò che gli altri non avevano notato. Quando è abilitata la replica, SQL Server aggiunge un database di sistema aggiuntivo denominato "distribuzione". –

-5

no non esiste tale opzione AFAIK. Immagino tu possa controllare l'id sys.databases.owner_sid = 0x01.

Non penso che ci si debba preoccupare che MS cambi i nomi di sistema. Se lo facessero theat non avreste preoccuparsi per almeno 20 anni :)

0

Potete contare sulla funzione DB_ID() < = 4

che avrei dovuto lavorare molto duramente per il cambiamento questo ...

+0

DB_ID() restituisce la colonna dbid su sys.sysdatabases, giusto? –

+0

@Vinko: sì, lo fa – gbn

+6

Questo non è vero. Se hai un database di distributori, allora avrà un id> 4 ed è un sistema db. – Kevin

-3

owner_sid è pari a 0x01 solo per i database di sistema. Quindi è possibile utilizzarlo per riconoscere se il database è un DB di sistema o meno.

select * from sys.databases 
where owner_sid != 0x01 
+5

Questa non è una buona idea, dal momento che restituirà qualsiasi database di proprietà di 'sa', sistema o no. –

+0

Questo non funziona in Sql Azure, dove il master db avrà sid diverso da 0x01. –

Problemi correlati