SQL Server: как определить, является ли база данных системной базой данных?

Я знаю, что до сих пор (по крайней мере, до MSSQL 2005) системные базы данных были master, model, msdb и tempdb.

Дело в том, насколько я могу судить, это не гарантируется сохранение в будущем. И ни представление sys.databases, ни представление sys.sysdatabases не говорят мне, считается ли база данных системной базой данных.

Есть ли место, где можно получить эту информацию (независимо от того, считается ли база данных системной базой данных или нет)?


person Vinko Vrsalovic    schedule 30.11.2009    source источник


Ответы (5)


Только что погрузились в объект 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.

Надеюсь это поможет

Джимми

person Jimmy    schedule 13.03.2012
comment
Джимми уловил то, что другие упустили. Когда у вас включена репликация, SQL Server добавляет дополнительную системную базу данных с именем «распределение». - person Larry Silverman; 07.07.2012

SQL Server Management Studio использует это

если вы развернете «Системные базы данных» в «Обозревателе объектов» (видно из wirehark):

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.

person pwndad    schedule 03.06.2019

Вы можете положиться на функцию DB_ID() ‹= 4

Вам придется очень постараться, чтобы изменить это...

person gbn    schedule 30.11.2009
comment
Это неправда. Если у вас есть база данных дистрибьютора, то она будет иметь идентификатор › 4 и это системная база данных. - person Kevin; 21.12.2012
comment
Кроме того, в базе данных SQL Azure пользовательские базы данных начинаются с идентификатора 4, а не 5. - person cbailiss; 29.09.2014

owner_sid равен 0x01 только для системных баз данных. Таким образом, вы можете использовать его, чтобы распознать, является ли база данных системной БД или нет.

select * from sys.databases
where owner_sid != 0x01
person Soheil Bakhshi    schedule 30.04.2013
comment
Это не очень хорошая идея, так как она вернет любую базу данных, принадлежащую sa, независимо от того, система это или нет. - person Nick Craver; 17.06.2014
comment
Это не работает в Sql Azure, где главная БД будет иметь sid, отличный от 0x01. - person Jared Moore; 18.09.2015

нет такой опции нет AFAIK. Я думаю, вы могли бы проверить идентификатор sys.databases.owner_sid = 0x01.

Я не думаю, что вам нужно беспокоиться о том, что MS изменит имена системных баз данных. если бы они это сделали, вам бы не пришлось об этом беспокоиться как минимум 20 лет :)

person Mladen Prajdic    schedule 30.11.2009