Можно ли запрашивать системные базы данных на сервере SQL без использования имен? - PullRequest
6 голосов
/ 03 августа 2010

При выполнении запроса к нескольким базам данных на сервере SQL (2005+) иногда бывает необходимо исключить системную базу данных (master, model, tempdb, msdb и дистрибутив)

Есть ли ДРУГОЙ способ отфильтровать их, кроме

where name not in (''master', 'model', 'tempdb', 'msdb', 'distribution')

Я посмотрел на sys.databases и master.dbo.sysdatabase (не то же самое!)

[ОБНОВЛЕНИЕ] пример запроса, который я использую для поиска баз данных, для которых включена доставка журналов

select d.name, p.last_backup_date, s.secondary_server, s.secondary_database
from sys.databases d
    left outer join msdb..log_shipping_primary_databases p on p.primary_database = d.name
    left outer join msdb..log_shipping_primary_secondaries s on s.primary_id = p.primary_id
where name not in ('model','master','tempdb','distribution','msdb')
order by d.name

[ОБНОВЛЕНИЕ] Это кажется «наименее плохим» способом, если у кого-то еще нет лучшего способа?

SELECT * FROM 
master.sys.databases AS dtb 
WHERE (dtb.database_id < 5 or dtb.is_distributor = 1)

Ответы [ 3 ]

7 голосов
/ 03 августа 2010

Я запустил SQL Profiler и обновил узел системных баз данных в Management Studio. Использует запрос

...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)

Так что, думаю, вы могли бы объединить проверки dbid и is_distributor.

3 голосов
/ 03 августа 2010

Безопасных средств, кроме поиска по имени, не существует.Если вы хотите отфильтровать только четыре основные базы данных (master, model, msdb, tempdb), вы можете безопасно выполнить фильтрацию на DBID > 4.Однако база данных распространения получит DBID как обычную базу данных, и поэтому вы не можете полагаться на ее DBID.

0 голосов
/ 21 марта 2016
select
    *
from
    sys.databases
where
    name in ('master','model','msdb','tempdb')
    or is_distributor = 1
...