我已经根据一组条件创建了一个我想要删除的数据库列表,并delete_table
在主数据库中为其命名(这已经不包括 master、tempdb、model 和 msdb)。此表中唯一的一列name
包含应删除的确切数据库名称。
我将如何编写脚本以根据此列表删除服务器上的数据库?
谢谢!
我已经根据一组条件创建了一个我想要删除的数据库列表,并delete_table
在主数据库中为其命名(这已经不包括 master、tempdb、model 和 msdb)。此表中唯一的一列name
包含应删除的确切数据库名称。
我将如何编写脚本以根据此列表删除服务器上的数据库?
谢谢!
如果您想要一种快速编写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'
,等)。运行选择查询,然后使用结果执行。
我不明白需要用户表来解决这个问题。作为旁注,您应该避免在master
数据库中创建用户对象。当然,除了基于美学的原因之外,我想不出其他原因,但这似乎是错误的。
更多关于系统数据库中用户创建的对象...
MSDN声明不应在 中创建用户对象master
,但我认为提供的原因很薄弱。一个更实质性的论点涉及在服务包/版本升级期间对系统数据库对象发生的情况缺乏控制。
我并不是说下一次服务包升级会清除用户在 中创建的对象master
,但谁知道呢。将您的实用程序和管理类型对象放入用户创建的数据库中,这样就不会混淆。
快捷方式
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)