从List中有条件地删除服务器上的数据库

时间:2012-09-06 19:16:09

标签: sql-server-2008 tsql

我根据一组条件创建了一个我要删除的数据库列表,并在master数据库中标题为delete_table(这已经排除了master,tempdb,model和msdb)。此表中唯一的列是name,其中包含应删除的确切数据库名称。

我如何根据此列表编写会丢弃服务器上数据库的脚本?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您想快速编写DROP DATABASE命令的脚本:

--set database in single user mode, rolling back active transactions...be careful!
SELECT 'ALTER DATABASE ' + QUOTENAME(name) + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' FROM sys.databases WHERE name IN (...)
UNION
--drop database
SELECT 'DROP DATABASE ' + QUOTENAME(name) + ';' FROM sys.databases WHERE name IN (...);

用逗号分隔的数据库名称列表替换...(例如N'DatabaseOne', 'DatabaseTwo'等)。运行select查询,然后使用结果执行。

我不明白需要用户表来解决这个问题。作为旁注,您应该避免在master数据库中创建用户对象。当然,我不能想到一个基于美学的理由,但它似乎错误

有关系统数据库中用户创建的对象的更多信息......

MSDN表示不应在master中创建用户对象,但我认为提供的原因相当薄弱。更实质性的论点涉及在Service Pack /版本升级期间对系统数据库对象发生的情况缺乏控制。

我不是说下一个Service Pack升级会消除master中用户创建的对象,但谁知道呢。将您的实用程序和管理类型对象放在用户创建的数据库中,这样就不会产生混淆。

答案 1 :(得分:1)

快捷方式

DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL+ 'DROP DATABASE ' + QUOTENAME(name) + ';' 
FROM delete_table
EXECUTE (@SQL)

一种更安全的方法来确保数据库存在,并且每个数据库只有一次编写脚本才会有重复

DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL+ 'DROP DATABASE ' + QUOTENAME(name) + ';' 
FROM sys.databases WHERE name IN (SELECT name FROM delete_table); 
EXECUTE (@SQL) 

编辑添加alter database只需添加此行

DECLARE @SQL VARCHAR(MAX) = ''
SELECT @SQL = @SQL+ 
'ALTER DATABASE '+ QUOTENAME(name) + 'SET SINGLE_USER WITH ROLLBACK IMMEDIATE;' +
'DROP DATABASE ' + QUOTENAME(name) + ';' 
FROM sys.databases WHERE name IN (SELECT name FROM delete_table); 
EXECUTE (@SQL)