我知道到目前为止(至少在 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
对象(由 Microsoft 自己提供!)他们只是使用以下语句执行此操作:
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
is_distributor = 1
sys.databases
希望这可以帮助
吉米
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
您可以依赖 DB_ID() 函数 <= 4
你必须非常努力地改变这一点......
仅对于系统数据库,owner_sid 等于 0x01。所以你可以用它来识别数据库是否是系统数据库。
select * from sys.databases
where owner_sid != 0x01
不,没有这样的选项AFAIK。我想你可以检查 sys.databases.owner_sid = 0x01 的 id。
我认为您不必担心 MS 更改系统数据库名称。如果他们这样做,您至少 20 年都不必担心它:)