Удалить все базы данных с сервера - PullRequest
37 голосов
/ 25 апреля 2011

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

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

Ответы [ 9 ]

97 голосов
/ 25 апреля 2011

Вы можете сделать это через графический интерфейс SSMS.Выберите узел Databases, затем 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
'
14 голосов
/ 13 сентября 2013

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

-- 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 голосов
/ 29 июля 2016

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

('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
1 голос
/ 09 декабря 2015

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

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

093e83d-somename;
39s2ak3-anothername;

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

DROP DATABASE `093e83d-somename`;

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

Если у вас такая же проблема, и если у вас много баз данных, вам просто нужно создать пакетный скрипт со всеми необходимыми командами, а затем выполнить его на своем 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

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

1 голос
/ 29 августа 2014

Вот моя версия скрипта PowerShell. 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.

0 голосов
/ 17 декабря 2017

Безопасный способ удаления (удаления) всех баз данных в MS-SQL с использованием T-SQL - исключить все системные базы данных и любые другие базы данных, которые вы хотите сохранить, и специальные базы данных, такие как база данных хранилища данных ".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
0 голосов
/ 07 января 2017

Вы можете использовать Курсор так:

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

0 голосов
/ 12 января 2015

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

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

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

0 голосов
/ 29 мая 2014

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

-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...