我知道到目前为止(至少在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]

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

希望这有帮助

其他提示

您可以依赖DB_ID()函数<!> lt; = 4

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

SQL Server Management Studio使用此

如果展开<!>“系统数据库<!>”;在<!> quot;对象资源管理器<!>中; (从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

对于系统数据库,

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

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

没有没有这样的选择AFAIK。我猜你可以检查id.dys.databases.owner_sid = 0x01。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top