SQL Server: come stabilire se un database è un database di sistema?
-
10-07-2019 - |
Domanda
So che finora (almeno fino a MSSQL 2005), i database di sistema sono master, modello, msdb e tempdb.
Il fatto è che, per quanto ne so, non è garantito che questo sia conservato in futuro. E né la vista database sys.d né la vista database sys.sys mi dicono se un database è considerato un database di sistema.
Esiste un luogo in cui è possibile ottenere queste informazioni (indipendentemente dal fatto che un database sia considerato un database di sistema)
Soluzione
Appena immerso nell'oggetto Microsoft.SqlServer.Management.Smo.Database
(fornito dalla stessa Microsoft!)
Lo fanno semplicemente usando la 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 db di sistema;
è anche un db di sistema, se il campo is_distributor = 1
nella vista sys.databases
.
Spero che questo aiuti
Jimmy
Altri suggerimenti
Puoi fare affidamento sulla funzione DB_ID () < = 4
Dovresti lavorare molto duramente per cambiare questo ...
SQL Server Management Studio lo utilizza
se si espande " Database di sistema " in " Esplora oggetti " (visto da WireShark):
SELECT dtb.name AS [Database_Name]
FROM master.sys.databases AS dtb
WHERE (CAST(case when dtb.name in ('master','model','msdb','tempdb') then 1 else dtb.is_distributor end AS bit)=1)
Per semplicità ho rimosso le colonne irrilevanti, rimosso l'ordine e sostituito la variabile @ _msparam_0 con il suo valore 1
owner_sid è uguale a 0x01 solo per i database di sistema. Quindi puoi usarlo per riconoscere se il database è un DB di sistema o meno.
select * from sys.databases
where owner_sid != 0x01
no non esiste tale opzione AFAIK. immagino che potresti controllare l'id sys.databases.owner_sid = 0x01.
Non credo che dovresti preoccuparti che MS cambi i nomi dei db di sistema. se facessero il teatro non dovresti preoccupartene per almeno 20 anni :)