2014-07-26 2 views
1

테이블이없는 데이터베이스 삭제/삭제 (빈 데이터베이스 삭제)가 있습니까?테이블이없는 데이터베이스 삭제

서버가 나는 그것이 불가능하다고 생각 Microsoft SQL Server 2005를

+0

Sql Shell이 ​​최선의 선택입니다. – stckl0ve

+0

http://dba.stackexchange.com/questions/47726/how-to-query-a-database-for-empty-tables를 참조하십시오. 그런 다음 이름이 반환 된 테이블을 삭제하십시오. – scrayne

+1

@DanRitchie 그건 OP가 찾고 있던 것이지 .... 우리는 테이블이 아니라 데이터베이스에 대해 이야기하고 있습니다. –

답변

1

이렇게해야합니다. 실험실 컴퓨터에서 테스트되었으며 0 개의 사용자 테이블로 모든 데이터베이스가 삭제되었습니다. 그러나 테이블이 데이터베이스의 유일한 요소는 아닙니다. 누군가가 여전히 필요로하는 저장 프로 시저, 함수 등이있을 수 있습니다.

데이터베이스를 제거 할 때 위험한 조작임을 유의하십시오. 자신의 책임하에 사용하십시오. 나는 당신이 상처를 입었을 때 책임지지 않습니다.

USE [master]; 
DECLARE @name varchar(50); 
DECLARE @innerQuery varchar(max); 
DECLARE tableCursor CURSOR FOR SELECT name FROM sys.databases where owner_sid != 0x01; 
OPEN tableCursor; 

FETCH NEXT FROM tableCursor 
INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @innerQuery = 'USE [' + @name + ']; IF (SELECT COUNT(*) FROM sys.objects WHERE type = ''U'') = 0 
    BEGIN 
     USE [master]; 
     DROP DATABASE [' + @name + '] 
    END' 
    EXEC(@innerQuery) 
    FETCH NEXT FROM tableCursor INTO @name 
END 

CLOSE tableCursor; 
DEALLOCATE tableCursor; 

데이터베이스가 사용중인 경우 SQL Server는 해당 데이터를 삭제하지 않습니다. 따라서이 데이터베이스가 삭제하려고 시도하는 특정 데이터베이스에 대한 다른 연결이 있으면 명령이 중단됩니다.

문제를 방지하려면 해당 데이터베이스를 단일 사용자 모드로 설정할 수 있습니다.

다음 스크립트는 활성 데이터베이스 연결을 종료하기 위해 대상 데이터베이스를 단일 사용자 모드로 설정한다는 점을 제외하고는 위와 같습니다.

use [master]; 
DECLARE @name varchar(50); 
DECLARE @innerQuery varchar(max); 
DECLARE tableCursor CURSOR FOR SELECT name FROM sys.databases where owner_sid != 0x01; 
OPEN tableCursor; 

FETCH NEXT FROM tableCursor 
INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @innerQuery = 
    'USE [' + @name + ']; 
    IF (SELECT COUNT(*) FROM sys.objects WHERE type = ''U'') = 0 
    BEGIN 
     USE [master]; 
     ALTER DATABASE [' + @name + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
     DROP DATABASE [' + @name + ']; 
    END' 
    EXEC(@innerQuery) 
    FETCH NEXT FROM tableCursor INTO @name 
END 

CLOSE tableCursor; 
DEALLOCATE tableCursor; 
0

이다 (적어도 아닌 TSQL 명령, 어딘가에 저장 프로 시저 수 있습니다). sysobjects을 쿼리하고 발견되면 중단해야합니다. (그리고 디자인 테이블과 같은 시스템 객체 중 일부를 무시할지 결정해야합니다.

0

이 스크립트는 아래에 필요한 DROP의 DATABASE 스크립트를 생성합니다 : IT가 본질적으로 핵 옵션들 그대로, 더욱 조심 본과 함께 . 마스터 데이터베이스 컨텍스트에서이 명령문을 실행하기 위해 이것을 조정할 수도 있지만, 경우에 따라 먼저 검토하는 것이 좋습니다.

EXEC sp_MSforeachdb N' 
    USE [?]; 
    IF N''?'' NOT IN(N''master'', N''model'', N''msdb'', N''tempdb'') 
    BEGIN 
     IF NOT EXISTS(
      SELECT * 
      FROM sys.tables 
      WHERE 
       OBJECTPROPERTYEX(object_id, ''IsMSShipped'') = 0 
      ) 
     BEGIN 
      PRINT ''DROP DATABASE [?];''; 
     END; 
    END;'; 
관련 문제