2009-11-30 7 views
12

Je sais que jusqu'à présent (jusqu'à MSSQL 2005 au moins), les bases de données système sont master, model, msdb et tempdb.SQL Server: Comment savoir si une base de données est une base de données système?

Ce que je peux dire, c'est que ce n'est pas garanti pour l'avenir. Et ni la vue sys.databases ni la vue sys.sysdatabases ne me disent si une base de données est considérée comme une base de données système.

Y a-t-il un endroit où cette information (si une base de données est considérée comme une base de données système ou non) peut être obtenue?

Répondre

16

Juste plongé dans Microsoft.SqlServer.Management.Smo.Database objet (qui est fourni par Microsoft lui-même!) Ils font tout simplement cela en utilisant la déclaration suivante:

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

en bref: si une base de données est nommé master, model, msdb ou tempdb, c'est un système db; c'est aussi un système db, si le champ is_distributor = 1 dans la vue sys.databases.

Hope this helps

Jimmy

+0

Jimmy a détecté ce que les autres utilisateurs ont manqué. Lorsque la réplication est activée, SQL Server ajoute une base de données système supplémentaire appelée «distribution». –

-5

il n'y a pas une telle option AFAIK. Je suppose que vous pourriez vérifier l'id le sys.databases.owner_sid = 0x01.

Je ne pense pas que vous ayez à vous soucier de MS changeant les noms de DB du système. si elles ne theat vous n'auriez pas à se soucier pendant au moins 20 ans :)

0

Vous pouvez compter sur la fonction < = 4

Vous auriez DB_ID() pour travailler très dur pour le changement ce ...

+0

DB_ID() retourne la colonne dbid sur sys.sysdatabases, non? –

+0

@Vinko: oui, c'est le cas – gbn

+6

Ce n'est pas vrai. Si vous avez une base de données de distributeur, alors il aura un id> 4 et c'est un système db. – Kevin

-3

owner_sid est égal à 0x01 juste pour les bases de données du système. Vous pouvez donc l'utiliser pour reconnaître si la base de données est une base de données système ou non.

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

Ce n'est pas une bonne idée, car il retournera n'importe quelle base de données possédée par 'sa', système ou non. –

+0

Cela ne fonctionne pas dans Sql Azure, où le maître db aura le sid autre que 0x01. –

Questions connexes