Question Supprimer toutes les bases de données du serveur


J'ai un serveur (SQL Server 2005) avec plus de 300 bases de données. Je ne veux pas faire un clic droit un par un et sélectionner Delete.

Comment puis-je supprimer toutes les bases de données facilement?


33
2018-04-25 10:31


origine


Réponses:


Vous pouvez le faire via l'interface graphique SSMS. Sélectionnez le Databases noeud alors F7 Pour afficher les détails de l'Explorateur d'objets, sélectionnez toutes les bases de données à supprimer, cliquez sur "Supprimer" et sélectionnez les options "Fermer les connexions existantes" et "Continuer après les erreurs".

Alternativement à travers TSQL, vous pouvez faire

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

Ce qui précède n’a pas été testé pour des raisons évidentes, vous pouvez donc remplacer le DROP commande avec PRINT commandes pour vérifier les choses en premier.

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

87
2018-04-25 10:39



Et voici ma solution pour le même problème:

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

12
2017-09-13 13:32



Voici ma version de script 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'"

Remarque: Vous devrez peut-être mettre à jour le fichier $ sqlCmdPath dans votre version de SQL.


1
2017-08-29 18:05



J'ai été confronté à un problème avec mes bases de données et les solutions ci-dessus ne fonctionnaient pas.

Je voulais simplement supprimer toutes mes bases de données, mais j'avais un problème avec leurs noms. En effet, j'avais des bases de données nommées comme ceci:

093e83d-somename;
39s2ak3-anothername;

Le moyen le plus simple de supprimer ces bases de données (testé sur MariaDB) consiste à exécuter la commande suivante:

DROP DATABASE `093e83d-somename`;

Ce type de nom semble poser problème lorsque nous voulons directement exécuter une commande SQL à partir d'un fichier bash, car nous devons spécifier le nom de la base de données entre guillemets (``).

Si vous avez le même problème, et si vous avez beaucoup de bases de données, il vous suffit de créer un script de commandes avec toutes les commandes dont vous avez besoin, puis d'exécuter celle-ci sur votre serveur SQL.

Exemple avec 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

Je pense que ce script fonctionne dans tous les cas. J'espère que cela a aidé.


1
2017-12-09 15:50



Cela va tuer toutes les connexions et supprimer toutes les bases de données ne figurant pas dans la liste:

('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
2017-07-29 15:53



J'ai utilisé la réponse fournie par Pellared et l'ai légèrement modifiée.

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

0
2018-05-28 21:34



Bien que la réponse de MartinSmith soit la solution correcte. J'ai trouvé la fenêtre Supprimer les objets simplement assise avec le statut «en cours» tout en supprimant la première des nombreuses bases de données. Cela était dû à un historique de sauvegarde msdb démesuré qui tentait d'être nettoyé avec l'option "Supprimer les informations de sauvegarde et de restauration de l'historique pour les bases de données" cochée.

Reportez-vous à ces liens pour plus d'informations sur le nettoyage de l'historique de sauvegarde. 1 2

Après avoir ajouté les index fournis ici, la suppression effectuée dans un délai raisonnable.


0
2018-01-12 16:39



Vous pouvez utiliser le curseur comme ceci:

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

Dans mon blog est plus sur ce sujet. www.pigeonsql.com


0
2018-01-07 12:51



La méthode sûre pour supprimer (supprimer) toutes les bases de données dans MS-SQL à l'aide de T-SQL consiste à exclure toutes les bases de données système et toute autre base de données à conserver, ainsi que les bases de données spéciales telles que la base de données Data Warehouse "DW". Base de données du serveur de rapports.

L'exclusion de toutes les bases de données que nous souhaitons conserver, y compris toutes les bases de données système, permettra de supprimer en toute sécurité tout ce que nous ne souhaitons pas conserver.

Par exemple:

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
2017-12-17 17:27