DROP DATABASE (Transact-SQL)
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)
从 SQL Server 数据库引擎实例中删除一个或多个用户数据库或数据库快照。
语法
SQL Server 语法。
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ]
[ ; ]
Azure SQL 数据库、Azure Synapse Analytics 和 Analytics Platform System 语法。
DROP DATABASE database_name
[ ; ]
参数
IF EXISTS
适用于:SQL Server 2016 (13.x) 及更高版本
只有在数据库已存在时才对其进行有条件地删除。
database_name
指定要删除的数据库的名称。 若要显示数据库列表,请使用 sys.databases 目录视图。
database_snapshot_name
指定要删除的数据库快照的名称。
注解
无论数据库处于下列哪种状态,都可将其删除:脱机状态、只读状态或可疑状态等。 若要显示数据库的当前状态,请使用 sys.databases
目录视图。
只有通过还原备份才能重新创建已删除的数据库。 无法备份数据库快照,因此无法还原。
删除数据库时,应备份 master 数据库。
执行数据库删除操作会从 SQL Server 实例中删除数据库,并删除该数据库使用的物理磁盘文件。 如果数据库或其任何一个文件在删除时处于脱机状态,则不会删除磁盘文件。 可以使用文件管理器(如文件资源管理器)手动删除这些文件。 若要从当前服务器删除数据库,但不从文件系统删除文件,请使用 sp_detach_db。
警告
在 SQL Server 2016(13.x)及更高版本中,删除具有 FILE_SNAPSHOT
与之关联的备份的数据库将成功,但不会删除具有关联快照的数据库文件,以避免引用这些数据库文件的备份失效。 文件将被截断,但不会以物理方式删除,以便使备份保持不变 FILE_SNAPSHOT
。 有关详细信息,请参阅使用 Azure Blob 存储 进行 SQL Server 备份和还原。
SQL Server
删除数据库快照会从 SQL Server 实例中删除数据库快照,并删除快照使用的物理 NTFS 文件系统稀疏文件。 有关按数据库快照使用稀疏文件的信息,请参阅数据库快照(SQL Server)。 删除数据库快照会清除与数据库快照关联的计划缓存中的条目,而不是整个实例。 清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。
对于计划缓存中每个清除的缓存存储,SQL Server 错误日志包含以下信息性消息。 每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。
SQL Server has encountered %d occurrence(s) of cachestore flush for the '%s' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
互操作性
SQL Server
若要删除针对事务复制发布的数据库,或者删除针对合并复制发布或订阅的数据库,必须首先从数据库中删除复制。 如果数据库已损坏,或者无法首先删除复制(或同时删除),在大多数情况下,仍可使用它脱机设置数据库 ALTER DATABASE
,然后删除数据库。
如果数据库涉及日志传送操作,请在删除数据库之前取消日志传送操作。 有关详细信息,请参阅关于日志传送 (SQL Server)。
限制
该 DROP DATABASE
语句必须以自动提交模式运行,并且不允许在显式或隐式事务中运行。 自动提交模式是默认的事务管理模式。
警告
无法删除当前正在使用的数据库。 这意味着任何用户都将有锁以供读取或写入。 从数据库中删除用户的一种方法是用于 ALTER DATABASE
将数据库设置为SINGLE_USER。 在此策略中,应执行ALTER DATABASE
DROP DATABASE
同一批,以避免允许另一个连接声明单个用户会话。 有关详细信息,请参阅 示例 D。
SQL Server
在删除数据库之前,必须将该数据库上的所有数据库快照都删除。
为 Stretch Database 删除数据库启用不会删除远程数据。 若要删除远程数据,必须手动删除。
重要
SQL Server 2022 (16.x) 和 Azure SQL 数据库中已弃用 Stretch Database。 在数据库引擎的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
Azure SQL 数据库
必须连接到 master
数据库才能删除数据库。
该 DROP DATABASE
语句必须是 SQL 批处理中唯一的语句,一次只能删除一个数据库。
Azure Synapse Analytics
必须连接到 master
数据库才能删除数据库。
该 DROP DATABASE
语句必须是 SQL 批处理中唯一的语句,一次只能删除一个数据库。
权限
SQL Server
CONTROL
需要对数据库或ALTER ANY DATABASE
权限或db_owner固定数据库角色的成员身份具有权限。
Azure SQL 数据库
只有服务器级别主体登录名(由预配过程创建)或 dbmanager 数据库角色的成员可以删除数据库。
Analytics Platform System (PDW)
CONTROL
需要对数据库或ALTER ANY DATABASE
权限或db_owner固定数据库角色的成员身份具有权限。
示例
A. 删除单一数据库
以下示例删除 Sales
数据库。
DROP DATABASE Sales;
B. 删除多个数据库
以下示例删除每个列出的数据库。
DROP DATABASE Sales, NewSales;
°C 删除数据库快照
以下示例在不影响源数据库的情况下,删除名为 sales_snapshot0600
的数据库快照。
DROP DATABASE sales_snapshot0600;
D. 检查数据库是否存在后删除数据库
下面的示例首先检查是否存在名为 Sales
的数据库。 如果存在,该示例会将名为 Sales
的数据库更改为单用户模式,以强制断开所有其他会话的连接,然后删除该数据库。 有关 SINGLE_USER 的详细信息,请参阅 ALTER DATABASE SET 选项。
USE tempdb;
GO
DECLARE @SQL AS NVARCHAR (1000);
IF EXISTS (SELECT 1
FROM sys.databases
WHERE [name] = N'Sales')
BEGIN
SET @SQL = N'USE [Sales];
ALTER DATABASE Sales SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
USE [tempdb];
DROP DATABASE Sales;';
EXECUTE (@SQL);
END