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?
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?
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
'
¡Funcionó como un amuleto, gracias! –
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
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
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
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.
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.
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.
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
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
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
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? –
Tengo un instituto, ¡Todos los estudiantes tienen una base de datos! entonces ... – Moslem7026
Llegó tarde a la fiesta aquí, pero he tenido que hacer esto en una caja dev local de vez en cuando – MrBliz