web-dev-qa-db-fra.com

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 cliquer un par un avec le bouton droit de la souris et sélectionner Delete.

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

35
Moslem7026

Puoi farlo attraverso la GUI SSMS. Sélection de la liste des personnes Databasesname__F7Cliquez ici pour afficher, télécharger et télécharger la base de données si vous souhaitez une suppression, sélectionnez "Éliminer" et sélectionnez les options "Complémentaire" et "Répondant", puis cliquez sur "Continuer".

En alternativa tramite TSQL puoi farlo

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

Quant à savoir quelle est la meilleure amende non testée pour le comportement de chacun d'entre eux, il est possible de le survoler avec le nom de la victime DROPcon i comandi PRINTper verificare prima le cose.

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

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

Cela supprimera toutes les connexions et supprimera 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
2
Christopher Bantick

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 leur nom me posait problème. 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 genre de nom semble poser problème lorsque nous voulons directement exécuter une commande SQL depuis un fichier bash, car nous devons spécifier le nom de la base de données entre guillemets (``).

Si vous rencontrez le même problème et si vous avez beaucoup de bases de données, il vous suffit de créer un script batch avec toutes les commandes nécessaires, puis d'exécuter celui-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
Gangai Johann

Voici la version de mon 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: Il se peut que vous deviez mettre à jour $ sqlCmdPath avec votre version de SQL.

1
Bobby Cannon

Le moyen sûr de supprimer (supprimer) toutes les bases de données MS-SQL à l'aide de T-SQL consiste à exclure toutes les bases de données système et toute autre base de données que vous souhaitez conserver, ainsi que des 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, permet 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
Ashraf Abusada

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

Alors que la réponse de MartinSmith est la bonne solution. J'ai trouvé que la fenêtre Supprimer les objets ne contenait que l'état "en cours" lors de la suppression de la première d'une base de données. Cela était dû à un historique de sauvegarde msdb saturé qui tentait d'être nettoyé avec l'option "Supprimer les informations de l'historique de sauvegarde et de restauration pour les bases de données" cochée.

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

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

0
sonyisda1

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