2011-04-25 18 views
29

Tengo un servidor (SQL Server 2005) con más de 300 bases de datos. No deseo hacer clic con el botón derecho uno por uno y seleccionar Delete.Soltar todas las bases de datos del servidor

¿Cómo puedo eliminar todas las bases de datos fácilmente?

+0

No puedo pensar en una sola situación en la que cualquier persona tendría que retirar todos las bases de datos de usuario en el servidor. Yo personalmente nunca he visto esto. ¿Puedes describir por qué necesitas hacer esto? –

+3

Tengo un instituto, ¡Todos los estudiantes tienen una base de datos! entonces ... – Moslem7026

+1

Llegó tarde a la fiesta aquí, pero he tenido que hacer esto en una caja dev local de vez en cuando – MrBliz

Respuesta

81

Puede hacerlo a través de la GUI de SSMS. Seleccione el nodo Databases luego F7 para mostrar los detalles del Explorador de objetos, seleccione todas las bases de datos que desee eliminar, presione "Eliminar" y seleccione las opciones "Cerrar conexiones existentes" y "Continuar después de error".

Como alternativa a través de TSQL que puedes hacer

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

Lo anterior es sin probar mi final por razones que deberían ser obvias así que sería bueno para reemplazar el comando DROP con PRINT comandos para verificar lo primero.

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

¡Funcionó como un amuleto, gracias! –

+0

el 'sp_MSforeachdb' ignoraría las bases de datos que ya están en el modo' SINGLE_USER'. En este caso, ya sea usuario de la interfaz de usuario o construir una declaración seleccionando de '[maestro]. [Sys]. [Bases de datos]' como @pellared sugirió http://stackoverflow.com/a/18787646/671785 – Mikhail

12

Y aquí es mi solución para el mismo problema:

-- 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 
0

que utiliza la respuesta proporcionada por Pellared y modificar ligeramente.

-- 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 
1

Aquí está mi versión de script de 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'" 

Nota: Es posible que deba actualizar el $ sqlCmdPath a su versión de SQL.

0

Mientras que la respuesta de MartinSmith es la solución correcta. Encontré la ventana Eliminar Objetos simplemente con el estado de 'en proceso' mientras borraba la primera de muchas bases de datos. Esto se debió a un historial de copia de seguridad de msdb demasiado grande que intentaba limpiarse con la opción 'Eliminar copia de seguridad y restaurar la información del historial de bases de datos' seleccionada.

se refieren a estos enlaces para obtener más información sobre la limpieza de la historia de copia de seguridad 1 2

Después de añadir los índices proporcionan here, la eliminación procesado a través de en un tiempo razonable.

1

Me he enfrentado a un problema con mis bases de datos, y las soluciones anteriores no funcionaban.

Simplemente quería eliminar todas mis bases de datos, pero tuve un problema con sus nombres. De hecho, había bases de datos llamado así:

093e83d-somename; 
39s2ak3-anothername; 

La forma más fácil de eliminar estas bases de datos (probado en MariaDB) es ejecutar el siguiente comando:

DROP DATABASE `093e83d-somename`; 

Este tipo de nombre parece ser un problema cuando directamente queremos ejecutar un comando SQL desde un archivo bash, porque tenemos que especificar el nombre de la base de datos entre comillas (``).

Si tiene el mismo problema, y ​​si tiene muchas bases de datos, solo tiene que crear un script por lotes con todos los comandos que necesita y luego ejecutar este en su servidor SQL.

Ejemplo con 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 

Creo que esta secuencia de comandos funciona en todos los casos. Espero que esto haya ayudado.

1

Esto matará a todas las conexiones y eliminar todas las bases de datos no está en la lista:

('maestro', 'tempdb', 'modelo', '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 
0

Usted puede utilizar el cursor como esta:

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 

En mi blog es más sobre este tema. www.pigeonsql.com

0

La forma segura de borrar (eliminar) todas las bases de datos en MS-SQL utilizando T-SQL es excluir todas las bases de datos del sistema y cualquier otra base de datos que desee conservar, y bases de datos especiales como Datos Base de datos de almacén "DW", base de datos del servidor de informes.

Excluyendo todas las bases de datos que queremos conservar, incluidas todas las bases de datos del sistema, eliminaremos todo lo que no deseemos.

Por ejemplo:

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 
Cuestiones relacionadas