6

在 SQL server (2005+) 中对多个数据库进行查询时,我发现有时需要排除系统数据库(master、model、tempdb、msdb 和 distribution)

除了这些,还有其他方法可以过滤吗

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

我看过 sys.databases 和 master.dbo.sysdatabases (不一样!)

[UPDATE] 一个示例查询,我用它来查找启用了日志传送的数据库

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

3 回答 3

8

我运行 SQL Profiler 并刷新了管理工作室中的系统数据库节点。它使用查询

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

所以我想你可以结合dbidis_distributor检查。

于 2010-08-03T14:34:33.643 回答
3

除了搜索名称之外,没有其他安全方法。如果您只想过滤掉四个主要数据库(master、model、msdb、tempdb),您可以安全地过滤DBID > 4. 但是,分发数据库会像普通数据库一样获得 DBID,因此您不能依赖它的 DBID。

于 2010-08-03T14:23:00.403 回答
-1
select
    *
from
    sys.databases
where
    name in ('master','model','msdb','tempdb')
    or is_distributor = 1
于 2016-03-21T10:33:49.403 回答