2009-11-30 30 views
12

Sé que hasta ahora (hasta MSSQL 2005 al menos), las bases de datos del sistema son master, model, msdb y tempdb.Servidor SQL: ¿Cómo saber si una base de datos es una base de datos del sistema?

La cosa es, hasta donde puedo decir, esto no está garantizado para ser preservado en el futuro. Y ni la vista sys.databases ni la vista sys.sysdatabases me dicen si una base de datos se considera como una base de datos del sistema.

¿Hay algún lugar donde se pueda obtener esta información (ya sea una base de datos considerada o no como una base de datos del sistema)?

Respuesta

16

Sólo se sumergió en Microsoft.SqlServer.Management.Smo.Database objeto (que es proporcionada por la propia Microsoft!) Ellos simplemente hacer esto utilizando siguiente declaración:

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

En resumen: si una base de datos se denomina master, model, msdb o tempdb, ES un sistema db; también es un sistema db, si el campo is_distributor = 1 en la vista sys.databases.

Esperanza esto ayuda

Jimmy

+0

Jimmy captó lo que otros no vieron. Cuando tiene habilitada la replicación, SQL Server agrega una base de datos del sistema adicional llamada 'distribución'. –

-5

no existe tal opción AFAIK. Supongo que podría verificar el ID sys.databases.owner_sid = 0x01.

No creo que tenga que preocuparse de que MS cambie los nombres de los nombres del sistema. si lo hicieran theat que no tendrían que preocuparse por ello durante al menos 20 años :)

0

Puede confiar en la función DB_ID() < = 4

que tendría que trabajar muy duro para el cambio esto ...

+0

DB_ID() devuelve la columna dbid en sys.sysdatabases, ¿verdad? –

+0

@Vinko: sí, lo hace – gbn

+6

Esto no es verdad. Si tiene una base de datos de distribuidores, tendrá una identificación> 4 y es un sistema db. – Kevin

-3

owner_sid es igual a 0x01 sólo para las bases de datos del sistema. Para que pueda usarlo para reconocer si la base de datos es una base de datos del sistema o no.

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

No es una buena idea, ya que devolverá cualquier base de datos propiedad de 'sa', system o no. –

+0

Esto no funciona en Sql Azure, donde el maestro db tendrá sid distinto de 0x01. –

Cuestiones relacionadas