我知道到目前为止(至少到MSSQL 2005),系统数据库有master、model、msdb和tempdb。
问题在于,据我所知,这未来不保证会被保留。而且无论是sys.databases视图还是sys.sysdatabases视图都不能告诉我一个数据库是否被视为系统数据库。
是否有某个地方可以获取这些信息(一个数据库是否被视为系统数据库)?
我知道到目前为止(至少到MSSQL 2005),系统数据库有master、model、msdb和tempdb。
问题在于,据我所知,这未来不保证会被保留。而且无论是sys.databases视图还是sys.sysdatabases视图都不能告诉我一个数据库是否被视为系统数据库。
是否有某个地方可以获取这些信息(一个数据库是否被视为系统数据库)?
我刚开始使用 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]
简而言之,如果数据库名为master
、model
、msdb
或tempdb
,它就是系统数据库;如果在视图sys.databases
中的is_distributor = 1
字段,则它也是系统数据库。如果你在"对象资源管理器"中展开"系统数据库"(从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)
你可以依赖于DB_ID()函数 <= 4
你需要非常努力才能改变这个...
owner_sid仅在系统数据库中等于0x01。 因此,您可以使用它来识别数据库是否为系统数据库。
select * from sys.databases
where owner_sid != 0x01
sa
所拥有的数据库,无论是系统的还是非系统的。 - Nick Craver没有这样的选项,据我所知。我猜你可以检查id,看看sys.databases.owner_sid = 0x01。
我不认为你需要担心MS更改系统数据库名称。如果他们这样做了,你至少不用担心20年 :)