Подтвердить что ты не робот

Отбросить все базы данных с сервера

У меня есть сервер (SQL Server 2005) с более чем 300 базами данных. Я не хочу, чтобы щелкнуть правой кнопкой мыши по одному и выбрать Delete.

Как легко удалить все базы данных?

4b9b3361

Ответ 1

Вы можете сделать это через GUI SSMS. Выберите Databases node, затем F7, чтобы открыть сведения обозревателя объектов, выберите все базы данных, которые вы хотите удалить, нажмите "Удалить" и выберите опции "Закрыть существующие подключения" и "Продолжить после ошибки".

Альтернативно через TSQL вы можете сделать

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]
END'

Вышеупомянутый непроверенный мой конец по причинам, которые должны быть очевидны, поэтому вы можете заменить команду DROP командами PRINT, чтобы сначала проверить вещи.

EXEC sp_MSforeachdb '
IF DB_ID(''?'') > 4
BEGIN
PRINT (''
ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [?]'')
END
'

Ответ 2

И вот мое решение для той же проблемы:

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
 where [name] not in ( 'master', 'model', 'msdb', 'tempdb');

SELECT @command
EXECUTE sp_executesql @command

Ответ 3

Вот моя версия PowerShell script. DropAllDatabases.ps1

$sqlCmdPath="C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\sqlcmd.exe"
& $sqlCmdPath -S localhost -Q "EXEC sp_MSforeachdb 'IF DB_ID(''?'') > 4 BEGIN PRINT ''?'' ALTER DATABASE [?] SET SINGLE_USER WITH ROLLBACK IMMEDIATE DROP DATABASE [?] END'"

Примечание. Вам может потребоваться обновить $sqlCmdPath до вашей версии SQL.

Ответ 4

Я столкнулся с проблемой с моими базами данных, и вышеупомянутые решения не работали.

Я просто хотел удалить все мои базы данных, но у меня была проблема с их именами. Действительно, у меня были базы данных, названные так:

093e83d-somename;
39s2ak3-anothername;

Более простой способ удалить эту базу данных (проверенную на MariaDB) - выполнить следующую команду:

DROP DATABASE `093e83d-somename`;

Такое имя кажется проблемой, когда мы непосредственно хотим выполнить команду SQL из файла bash, потому что мы должны указать имя базы данных между обратными кавычками (``).

Если у вас есть такая же проблема, и если у вас много баз данных, вам просто нужно создать пакетный пакет script со всеми необходимыми командами, а затем выполнить его на своем SQL-сервере.

Пример с test.sh:

#!/bin/bash

# Informations needed
MUSER="root"
MPASS="pass"

# We get the needed binaries
MYSQL=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)

# We get all the DB names in DB
DB=$($MYSQL -u $MUSER -p$MPASS -e 'show databases' | $AWK '{ print $1}' | $GREP -v '^Databases' )

# For each database, we write the drop command in the file test.sql
for t in $DB
do
    echo -e "DROP DATABASE \`$t\`;" >> test.sql
done

# We execute the created SQL file with all the DROP commands
$MYSQL -u $MUSER -p$MPASS -e 'source test.sql;'

# We finally delete the created file.
rm test.sql

Я думаю, что этот script работает во всех случаях. Надеюсь, это помогло.

Ответ 5

Я использовал ответ, предоставленный Pellared, и немного изменил его.

-- drops all user databases
DECLARE @command nvarchar(max)
SET @command = ''

SELECT  @command = @command
+ 'ALTER DATABASE [' + [name] + ']  SET single_user with rollback immediate;'+CHAR(13)+CHAR(10)
+ 'DROP DATABASE [' + [name] +'];'+CHAR(13)+CHAR(10)
FROM  [master].[sys].[databases] 
where [name] like 'DBName%';

-- PRINT @COMMAND
EXECUTE sp_executesql @command

Ответ 6

В то время как ответ MartinSmith является правильным решением. Я обнаружил, что окно "Удалить объекты" просто сидит со статусом "in process" при удалении первой из многих баз данных. Это произошло из-за переполненной истории резервных копий msdb, которая пыталась очищаться с помощью опции "Удалить резервную копию и восстановить историю истории для баз данных".

Обратитесь к этим ссылкам за дополнительной информацией об очистке истории резервного копирования 1 2

После добавления индексов, предоставленных здесь, удаление обрабатывается через разумное время.

Ответ 7

Это приведет к удалению всех подключений и удалению всех баз данных, не входящих в список:

('master', 'tempdb', 'model', 'msdb', 'ReportServer'   , 'ReportServerTempDB')


use [master]

DECLARE 
@DATABASENAME nVARCHAR(20)

DECLARE
@TABLE TABLE
(NAME nVARCHAR(50))

Declare @SQL nvarchar(100)

INSERT INTO @TABLE

SELECT 
name 
FROM sys.databases 
WHERE name not in 
    ('master'
    ,'tempdb'
    ,'model'
    ,'msdb'
    ,'ReportServer'
    ,'ReportServerTempDB')


while (select COUNT(*) from @table) > 0

begin

select @DATABASENAME = (select top 1 (name) from @TABLE)

DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses 
WHERE dbid = db_id(@DATABASENAME)

EXEC(@kill);

set @SQL = 'drop database ' + @DATABASENAME

exec sp_executesql @SQL, N'@databasename nvarchar(50)', @databasename; 

print @databasename + ' has been deleted'

delete from @TABLE where NAME = @DATABASENAME

end

Ответ 8

Вы можете использовать курсор следующим образом:

DECLARE @DBName VARCHAR (64)
DECLARE @SQL VARCHAR (255)

DECLARE DROPDB CURSOR FOR 
SELECT name FROM sys.databases
WHERE name NOT IN ('master','model','msdb','tempdb','distribution','ReportServer','ReportServerTempDB')

OPEN DROPDB
FETCH next FROM DROPDB INTO @DBName
WHILE @@FETCH_STATUS = 0

BEGIN
    SET @SQL = 'DROP DATABASE ' + @DBName
    PRINT @SQL
    EXEC @SQL
    FETCH next FROM DROPDB INTO @DBName
END

CLOSE DROPDB
DEALLOCATE DROPDB

В моем блоге больше об этой теме. www.pigeonsql.com

Ответ 9

Безопасный способ удаления (удаления) всех баз данных в MS-SQL с использованием T-SQL - исключить все системные базы данных и любые другие базы данных, которые вы хотите сохранить, и специальные базы данных, такие как база данных Data Warehouse "DW", базу данных сервера отчетов.

Исключая все базы данных, которые мы хотим сохранить, включая все системные базы данных, будет безопасно удалять все остальное, что мы не хотим сохранить.

Например:

use master
go
declare @dbnames nvarchar(max)
declare @statement nvarchar(max)
set @dbnames = ''
set @statement = ''
select @dbnames = @dbnames + ',[' + name + ']' from sys.databases 
    where name 
    NOT IN ('master','model','msdb','tempdb') 
    AND name NOT LIKE '%AdventureWorks%' -- Database to keep 
    AND name NOT LIKE '%DW%' -- Data warehouse database
    AND name NOT LIKE '%ReportServer%' -- Report server database
if len(@dbnames) = 0
    begin
    print 'no databases to drop'
    end
else
    begin
    set @statement = 'drop database ' + substring(@dbnames, 2, len(@dbnames))
    print @statement
    exec sp_executesql @statement
    end
go