2009-11-30 45 views
12

我知道到目前爲止(至少在MSSQL 2005之前),系統數據庫是master,model,msdb和tempdb。SQL Server:如何判斷數據庫是否是系統數據庫?

據我所知,這是不能保證將來保存的。 sys.databases視圖和sys.sysdatabases視圖都不告訴我數據庫是否被視爲系統數據庫。

是否有某個地方可以獲取該信息(無論數據庫是否被認爲是系統數據庫)?

回答

16

就跳入Microsoft.SqlServer.Management.Smo.Database對象 他們只是做到這一點使用下面的語句(這是由微軟本身提供!):

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

簡而言之:如果數據庫被命名爲mastermodelmsdbtempdb,它是一個系統db; 它也是一個系統分貝,如果is_distributor = 1在視圖sys.databases

希望這有助於

吉米

+0

Jimmy抓住了別人錯過的內容。當您啓用複製時,SQL Server將添加一個名爲'distribution'的額外系統數據庫。 – 2012-07-06 20:01:04

-5

不,沒有這樣的選項AFAIK。我想你可以檢查ID sys.databases.owner_sid = 0x01。

我不認爲你必須擔心MS更改系統數據庫名稱。如果他們theat你就不必擔心它至少20年:)

0

可以依靠DB_ID()函數< = 4

你不得不非常努力地工作,以改變這...

+0

DB_ID()返回sys.sysdatabases上的dbid列,對嗎? – 2009-11-30 11:24:24

+0

@Vinko:是的,它確實 – gbn 2009-11-30 11:40:30

+6

這是不正確的。如果你有分銷商數據庫,那麼它將有一個id> 4,它是一個系統數據庫。 – Kevin 2012-12-21 14:38:12

-3

owner_sid等於只是0X01系統數據庫。 因此,您可以使用它來識別數據庫是否是系統數據庫。

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

這不是一個好主意,因爲它會返回任何由'sa',系統擁有的數據庫。 – 2014-06-16 21:31:15

+0

這不適用於Sql Azure,其中主數據庫的sid不是0x01。 – 2015-09-17 22:16:51

相關問題