SQL Server: как определить, является ли база данных системной базой данных? - PullRequest
12 голосов
/ 30 ноября 2009

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

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

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

Ответы [ 5 ]

18 голосов
/ 13 марта 2012

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

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

Jimmy

0 голосов
/ 03 июня 2019

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

0 голосов
/ 30 апреля 2013

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

select * from sys.databases
where owner_sid != 0x01
0 голосов
/ 30 ноября 2009

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

Тебе пришлось бы потрудиться, чтобы изменить это ...

0 голосов
/ 30 ноября 2009

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

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

...