16

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

事情是,据我所知,这不能保证将来会保留。sys.databases 视图和 sys.sysdatabases 视图都不会告诉我数据库是否被视为系统数据库。

是否可以在某个地方获得此信息(数据库是否被视为系统数据库)?

4

5 回答 5

22

刚刚深入研究Microsoft.SqlServer.Management.Smo.Database对象(由 Microsoft 自己提供!)他们只是使用以下语句执行此操作:

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

简而言之:如果数据库名为master、或model,则它是系统数据库;它也是一个系统数据库,如果视图中的字段。msdbtempdbis_distributor = 1sys.databases

希望这可以帮助

吉米

于 2012-03-13T10:55:53.840 回答
2

SQL Server Management Studio 使用这个

如果您在“对象资源管理器”中展开“系统数据库”(从 wireshark 看到):

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

于 2019-06-03T09:13:09.817 回答
0

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

你必须非常努力地改变这一点......

于 2009-11-30T11:17:35.857 回答
-4

仅对于系统数据库,owner_sid 等于 0x01。所以你可以用它来识别数据库是否是系统数据库。

select * from sys.databases
where owner_sid != 0x01
于 2013-04-30T02:05:22.720 回答
-6

不,没有这样的选项AFAIK。我想你可以检查 sys.databases.owner_sid = 0x01 的 id。

我认为您不必担心 MS 更改系统数据库名称。如果他们这样做,您至少 20 年都不必担心它:)

于 2009-11-30T11:09:55.887 回答