SQL Server:如何判断一个数据库是否是系统数据库?

16

我知道到目前为止(至少到MSSQL 2005),系统数据库有master、model、msdb和tempdb。

问题在于,据我所知,这未来不保证会被保留。而且无论是sys.databases视图还是sys.sysdatabases视图都不能告诉我一个数据库是否被视为系统数据库。

是否有某个地方可以获取这些信息(一个数据库是否被视为系统数据库)?

5个回答

24

我刚开始使用 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,它就是系统数据库;如果在视图sys.databases中的is_distributor = 1字段,则它也是系统数据库。
希望这可以帮助您。
Jimmy

2
Jimmy抓住了其他人错过的东西。当启用复制时,SQL Server会添加一个名为“distribution”的额外系统数据库。 - Larry Silverman

2

如果你在"对象资源管理器"中展开"系统数据库"(从wireshark中看到),SQL Server Management Studio将使用此功能。

注意:本文中的"Original Answer"翻译成"最初的回答"。

SELECT dtb.name AS [Database_Name]
FROM master.sys.databases AS dtb
WHERE (CAST(case when dtb.name in ('master','model','msdb','tempdb') then 1 else dtb.is_distributor end AS bit)=1)

为了简化起见,我删除了不相关的列,移除了orderby,并将@_msparam_0变量替换为其值1。"最初的回答"

0

你可以依赖于DB_ID()函数 <= 4

你需要非常努力才能改变这个...


8
这不是真的。如果你有经销商数据库,那么它将具有大于4的ID,并且它是一个系统数据库。 - Kevin
此外,在Azure SQL数据库中,用户数据库从ID 4开始,而不是5。 - cbailiss

-5

owner_sid仅在系统数据库中等于0x01。 因此,您可以使用它来识别数据库是否为系统数据库。

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

6
这不是个好主意,因为它会返回任何由 sa 所拥有的数据库,无论是系统的还是非系统的。 - Nick Craver
1
这在Sql Azure中不起作用,因为主数据库的sid将不同于0x01。 - Jared Moore
请参阅 https://www.brentozar.com/blitz/database-owners/ - sa 应该是所有数据库的所有者,并且最好禁用登录本身。 - Michael Tobisch

-6

没有这样的选项,据我所知。我猜你可以检查id,看看sys.databases.owner_sid = 0x01。

我不认为你需要担心MS更改系统数据库名称。如果他们这样做了,你至少不用担心20年 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接