2011-12-20 4 views
7

임시 데이터베이스 대신 'master'데이터베이스에서 실수로이 스크립트를 사용했습니다.실수로 'master'데이터베이스의 모든 데이터를 삭제했습니다.

sp_msforeachtable 'delete from ?' 

해를 입혔습니까? 그렇다면 어떻게 데이터를 복원 할 수 있습니까?

+3

가장 최근의 마스터 DB 백업을 복원하십시오. 너도 하나있어, 그렇지? –

+0

나는 가지고 있지 않습니다. 중요한 데이터가없는 개인 개발 DB이므로 SQL Server를 다시 설치해야만하는 최악의 상황이 발생할 수 있습니다. – Stijn

+0

SQL Server Studio, 맞습니까? –

답변

10

아니요 (사용자 테이블이 master 인 경우) 아무 것도 삭제하면 안됩니다.

테스트

exec sys.sp_MSforeachtable 'select ''?''' 

나를 위해 아무것도 반환하지 않습니다. 따라서 spt_values과 같은 시스템 테이블을 제외하는 것으로 보입니다.

편집 : 사실 OBJECTPROPERTY(o.id, N'IsUserTable') = 1

+0

나는 다르게 생각했지만 마틴이 맞을 수도 있다고 생각합니다. +1. – JonH

+0

와아! 감사! 내 데이터베이스를 날려 버렸다고 생각하고 다시 설치할 준비가되었습니다. 원하는 데이터베이스가 Sql Server Studio의 풀다운 메뉴에서 선택되었는지 확인하지 않으면 발생합니다. 왜 Microsoft인가? 왜 쿼리 창을 열기 전에 데이터베이스를 선택하겠습니까? 그들은 IsUserTable 상태에 넣어 주셔서 감사합니다. 유용성은 분명 Microsoft의 특징 중 하나가 아닙니다. –

+0

당신의 대답은 유용하지만 안심이 되겠지만'OBJECTPROPERTY' 절은 Stijn을 재설치에서 저장 한 것이 아닙니다. 동일한 실수를 한 후에 프로 시저 구현에 대한 흥미로운 점을 발견했습니다. 예를 들어 [내 대답] (http://stackoverflow.com/a/12530893/111424)을 참조하십시오. –

5

마틴 스미스는 sp_MSforeachtable 시스템 테이블을 삭제하지 않는 것을 말할 권리 곳은 테이블을 포함 않습니다 절차의 정의를 찾고 있습니다.

그러나 우리는 spt_valuesMSreplication_options과 같은 테이블을 시스템 테이블로 생각할 수 있지만 사실 SQL Server에 따른 사용자 테이블입니다.

내 마스터 데이터베이스에서이 쿼리를 실행하면 :

name     IsUserTable 
--------------------- ----------- 
spt_fallback_db  1 
spt_fallback_dev  1 
spt_fallback_usg  1 
spt_monitor   1 
MSreplication_options 1 

그래서 스테인은 다시 설치에서 저장된 방법 : 나는 다음과 같은 결과 집합을 참조

SELECT name, OBJECTPROPERTY(object_id, N'IsUserTable') AS IsUserTable 
FROM master.sys.tables; 

를? 당신이 sp_MSforeachtable 구현 방법을 보면

, 당신은 드롭 테이블을 선택하려면이 같은 무언가를 볼 수 있습니다 : 내 마스터 데이터베이스에서

declare @mscat nvarchar(12) 
select @mscat = ltrim(str(convert(int, 0x0002))) 

SELECT * 
from dbo.sysobjects o join sys.all_objects syso on o.id = syso.object_id 
where OBJECTPROPERTY(o.id, N'IsUserTable') = 1 and o.category & @mscat = 0; 

,이 빈 결과 집합을 반환합니다.

where 절은 테이블 sysobjectscategory 열에 비트 마스크를 적용하여 'mscat'이 아닌 테이블을 제외시킵니다.

그래서 시스템 데이터베이스 테이블이 아니라 'Microsoft'테이블이기 때문에 마스터 데이터베이스의 테이블이 보호됩니다.

출판, 제약 및 ID에 사용 :

카테고리 열이 사용이 완전히 Books Online에 문서화되지 않은는이 모든 막연한 설명입니다.

그러나 sysobjects 테이블은 어쨌든 사용되지 않으므로 사용해서는 안됩니다. :)

과 같을 것이다 지원보기 sys.tables를 사용하여 동등한 질의 : 내 마스터 데이터베이스에서

SELECT * 
FROM sys.tables 
WHERE is_ms_shipped = 0; 

,이 또한 빈 결과 집합을 반환합니다.

+0

+1 좋은 수정. –

관련 문제