2010-08-03 1 views
5

SQL 서버에서 여러 데이터베이스를 통해 쿼리 (2005 +) 나는 시스템 데이터베이스 (마스터, 모델, tempdb를, MSDB 및 유통)이름을 사용하지 않고 SQL 서버에서 시스템 데이터베이스를 쿼리 할 수 ​​있습니까?

를 제외하는 것이 때로는 모든 necesary 발견을하는 외에 다음을 필터링 할 수있는 다른 방법이 있나요

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

내가하려면 sys.databases 및 master.dbo.sysdatabases 검토 한 결과 (동일하지 않습니다!)

[업데이트] 내가 logshipping이

을 사용할 수있는 데이터베이스를 찾기 위해 사용 예제 쿼리
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) 
+1

실행중인 검색어의 예를 제공해 주시겠습니까? – Codesleuth

+0

예제 쿼리가 추가되었습니다. – edosoft

답변

6

SQL 프로필러를 실행하고 관리 스튜디오에서 시스템 데이터베이스 노드를 새로 고칩니다. 그것은

...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 검사를 결합 할 수도 있겠죠 쿼리를 사용합니다.

3

이름을 검색하는 것 이상의 안전한 방법은 없습니다. 네 가지 기본 데이터베이스 (master, model, msdb, tempdb) 만 필터링하려는 경우 DBID > 4에서 안전하게 필터링 할 수 있습니다. 그러나 배포 데이터베이스는 일반 데이터베이스와 같은 DBID를 가지므로 DBID에 의존 할 수 없습니다.

+0

감사합니다. 배포판 DBID에도 주목했습니다. 내 질문에 대한 근본적인 이유입니다. – edosoft

0
select 
    * 
from 
    sys.databases 
where 
    name in ('master','model','msdb','tempdb') 
    or is_distributor = 1