테이블이없는 데이터베이스 삭제/삭제 (빈 데이터베이스 삭제)가 있습니까?테이블이없는 데이터베이스 삭제
서버가 나는 그것이 불가능하다고 생각 Microsoft SQL Server 2005를
테이블이없는 데이터베이스 삭제/삭제 (빈 데이터베이스 삭제)가 있습니까?테이블이없는 데이터베이스 삭제
서버가 나는 그것이 불가능하다고 생각 Microsoft SQL Server 2005를
이렇게해야합니다. 실험실 컴퓨터에서 테스트되었으며 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;
이다 (적어도 아닌 TSQL 명령, 어딘가에 저장 프로 시저 수 있습니다). sysobjects
을 쿼리하고 발견되면 중단해야합니다. (그리고 디자인 테이블과 같은 시스템 객체 중 일부를 무시할지 결정해야합니다.
이 스크립트는 아래에 필요한 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;';
Sql Shell이 최선의 선택입니다. – stckl0ve
http://dba.stackexchange.com/questions/47726/how-to-query-a-database-for-empty-tables를 참조하십시오. 그런 다음 이름이 반환 된 테이블을 삭제하십시오. – scrayne
@DanRitchie 그건 OP가 찾고 있던 것이지 .... 우리는 테이블이 아니라 데이터베이스에 대해 이야기하고 있습니다. –