我根据一组条件创建了一个我要删除的数据库列表,并在master数据库中标题为delete_table
(这已经排除了master,tempdb,model和msdb)。此表中唯一的列是name
,其中包含应删除的确切数据库名称。
我如何根据此列表编写会丢弃服务器上数据库的脚本?
谢谢!
答案 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)