正在编写一个删除数据库的脚本。
在某些环境中,我们的数据库会定期从实时状态恢复, 建立复制(合并或事务),运行和测试流程,然后需要删除数据库,因为所有开发都已部署到实时状态,现在开始另一个循环。
作为自动删除数据库的一部分,到目前为止,我给出了以下脚本:
select
DROP_DB_SCRIPT='use master;' + char(13)
+ case when source_database_id is not null -- this is a database snapshot
then ''
else
' alter database ' + name + ' set single_user with rollback immediate ' + -- put db in single user mode
case when (sb.is_published = 1 or sb.is_merge_published = 1)
then 'EXEC sp_removedbreplication ' + '''' + name + '''' -- remove db from the replication
else ''
end +char(13)
end +char(13) +
' drop database ' + quotename(name) +char(13)
,*
from sys.databases sb
where database_id >= 5
and is_distributor= 0
上面的脚本除了生成一个可以用来删除所需数据库或一组数据库的脚本之外不会执行任何其他操作。
它考虑了复制(您需要单独删除复制),并且数据库是否是数据库快照,这是不同的事情。
我没有考虑过以下几点:
在删除 OFFLINE 数据库之前是否应将其设置为 EMERGENCY?
这里的问题是:您是否发现我应该添加但却没有添加任何内容?
我已经处理了两件事:
- 数据库是一个快照
- 数据库参与复制
我还没有处理过:
- 数据库是可用性组的一部分(在这种情况下,我需要先将其从 AG 中删除)
- 你还看到了什么吗?
database_id > 5 不是一个好主意。在某些情况下,系统数据库的 id 可以 >= 5(以就地更新为例)...
因此,使用:
对于 AG 您还可以使用: