2009-11-30 49 views
12

Tôi biết rằng cho đến nay (cho đến MSSQL 2005 ít nhất), cơ sở dữ liệu hệ thống là chủ, mô hình, msdb và tempdb.SQL Server: Làm thế nào để biết cơ sở dữ liệu là một cơ sở dữ liệu hệ thống?

Thing, theo như tôi có thể nói, điều này không được bảo đảm để được giữ nguyên trong tương lai. Và cả khung nhìn sys.databases lẫn khung nhìn sys.sysdatabases đều không cho tôi biết nếu một cơ sở dữ liệu được xem như là một cơ sở dữ liệu hệ thống.

Có nơi nào mà thông tin này (cho dù cơ sở dữ liệu được coi là cơ sở dữ liệu hệ thống hay không) có thể có được?

Trả lời

16

Chỉ cần lặn xuống Microsoft.SqlServer.Management.Smo.Database đối tượng (được cung cấp bởi Microsoft chính nó!) Họ chỉ đơn giản làm điều này bằng tuyên bố sau:

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

Nói tóm lại: nếu một cơ sở dữ liệu được đặt tên master, model, msdb hoặc tempdb, đó là hệ thống db; nó cũng là db hệ thống, nếu trường is_distributor = 1 trong chế độ xem sys.databases.

Hope this helps

Jimmy

+0

Jimmy đã bắt được những gì người khác bỏ qua. Khi bạn đã bật tính năng sao chép, SQL Server sẽ thêm một cơ sở dữ liệu hệ thống bổ sung có tên 'phân phối'. –

-5

không có tùy chọn AFAIK nào như vậy. tôi đoán bạn có thể kiểm tra id sys.databases.owner_sid = 0x01.

tôi không nghĩ rằng bạn phải lo lắng về việc MS thay đổi tên hệ thống db. nếu họ theat bạn sẽ không phải lo lắng về điều đó trong vòng ít nhất 20 năm :)

0

Bạn có thể dựa vào DB_ID() chức năng < = 4

Bạn sẽ phải làm việc rất vất vả để thay đổi này ...

+0

DB_ID() trả về cột dbid trên sys.sysdatabases, phải không? –

+0

@Vinko: vâng, nó có – gbn

+6

Điều này không đúng. Nếu bạn có cơ sở dữ liệu phân phối, thì nó sẽ có id> 4 và nó là db hệ thống. – Kevin

-3

owner_sid bằng 0x01 chỉ dành riêng cho cơ sở dữ liệu hệ thống. Vì vậy, bạn có thể sử dụng nó để nhận ra nếu cơ sở dữ liệu là một hệ thống DB hay không.

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

Đây không phải là một ý tưởng hay vì nó sẽ trả về bất kỳ cơ sở dữ liệu nào thuộc sở hữu của 'sa', hệ thống hay không. –

+0

Điều này không hoạt động trong Sql Azure, trong đó db chủ sẽ có lề ngoài 0x01. –

Các vấn đề liên quan