2009-11-30 16 views
12

Wiem, że do tej pory (przynajmniej do MSSQL 2005), systemowymi bazami danych są: master, model, msdb i tempdb.Serwer SQL: Jak sprawdzić, czy baza danych jest bazą danych systemu?

Chodzi o to, o ile mogę powiedzieć, że nie ma gwarancji, że zostanie zachowany w przyszłości. I ani widok sys.databases, ani widok sys.sysdatabases nie mówią mi, czy baza danych jest uważana za systemową bazę danych.

Czy istnieje miejsce, w którym można uzyskać tę informację (niezależnie od tego, czy baza danych jest uważana za systemową bazę danych)?

Odpowiedz

16

Wystarczy zanurkował Microsoft.SqlServer.Management.Smo.Database obiektu (która jest dostarczana przez firmę Microsoft sobie!) oni po prostu zrobić to za pomocą następującej klauzuli:

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

w skrócie: jeśli baza danych jest nazwany master, model, msdb lub tempdb, jest to system db; to także system db, jeśli pole is_distributor = 1 w widoku sys.databases.

Nadzieja to pomaga

Jimmy

+0

Jimmy złapał to, co inni przegapili. Po włączeniu replikacji program SQL Server dodaje dodatkową systemową bazę danych o nazwie "dystrybucja". –

-5

Nie ma takiej opcji AFAIK. Myślę, że możesz sprawdzić id sys.databases.owner_sid = 0x01.

Nie sądzę, żebyś musiał się martwić, że MS zmieni nazwy systemowe. Jeśli tak theat byś nie musiał martwić się o nim przez co najmniej 20 lat :)

0

Można polegać na funkcji DB_ID() < = 4

Trzeba ciężko pracować na zmiany to ...

+0

DB_ID() zwraca kolumnę dbid na sys.sysbazy danych, prawda? –

+0

@ Vinko: tak, robi to – gbn

+6

To nie jest prawda. Jeśli masz bazę dystrybutorów, będzie ona miała identyfikator> 4 i będzie to db systemowy. – Kevin

-3

owner_sid jest równa 0x01 tylko dla baz danych systemu. Dzięki czemu można go używać do rozpoznawania, czy baza danych jest systemem DB, czy nie.

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

To nie jest dobry pomysł, ponieważ zwróci dowolną bazę danych posiadaną przez 'sa', system lub nie. –

+0

To nie działa w Sql Azure, gdzie główny db będzie miał sid inny niż 0x01. –

Powiązane problemy