DROP DATABASE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

从 SQL Server 实例中删除一个或多个用户数据库或数据库快照。

Transact-SQL 语法约定

语法

-- SQL Server Syntax
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;]
-- Azure SQL Database, Azure Synapse Analytics and Analytics Platform System Syntax
DROP DATABASE database_name [;]

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

IF EXISTS
适用范围:SQL Server(SQL Server 2016 (13.x) 到当前版本)。

只有在数据库已存在时才对其进行有条件地删除。

database_name 指定要删除的数据库的名称。 若要显示数据库列表,请使用 sys.databases 目录视图。

database_snapshot_name 适用于:SQL Server 2008 (10.0.x) 及更高版本。

指定要删除的数据库快照的名称。

一般备注

无论数据库处于下列哪种状态,都可将其删除:脱机状态、只读状态或可疑状态等。 若要显示数据库的当前状态,请使用 sys.databases 目录视图。

只有通过还原备份才能重新创建已删除的数据库。 数据库快照无法备份,因此也就无法还原。

删除数据库时,应备份 master 数据库

执行数据库删除操作会从 SQL Server 实例中删除数据库,并删除该数据库使用的物理磁盘文件。 执行删除操作时,如果数据库或它的任意一个文件处于脱机状态,则不会删除磁盘文件。 可使用 Windows 资源管理器手动删除这些文件。 若要从当前服务器删除数据库,但不从文件系统删除文件,请使用 sp_detach_db

警告

删除具有与其关联的 FILE_SNAPSHOT 备份的数据库将成功,但不会删除具有关联快照的数据库文件,以免使引用这些数据库文件的备份失效。 将截断该文件,但不会以物理方式将其删除,以保持 FILE_SNAPSHOT 备份不受影响。 有关详细信息,请参阅使用 Microsoft Azure Blob 存储执行 SQL Server 备份和还原。 适用于:SQL Server 2016 (13.x) 到 当前版本

SQL Server

执行数据库快照删除操作会从 SQL Server 实例中删除数据库快照,并删除该快照使用的物理 NTFS 文件系统稀疏文件。 有关数据库快照如何使用稀疏文件的信息,请参阅数据库快照。 删除数据库快照将清除 SQL Server 实例的计划缓存。 清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。 对于计划缓存中每个已清除的缓存存储区,SQL Server 错误日志包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新”。 每隔五分钟,只要缓存在这段时间间隔内得到刷新,此消息就记录一次。

互操作性

SQL Server

若要删除针对事务复制发布的数据库,或者删除针对合并复制发布或订阅的数据库,必须首先从数据库中删除复制。 如果数据库损坏或无法首先删除复制,或这两种情况同时存在,那么在多数情况下仍然可以删除数据库,方法是使用 ALTER DATABASE 将数据库设置为脱机,然后将其删除。

如果数据库涉及日志传送操作,请在删除数据库之前取消日志传送操作。 有关详细信息,请参阅 关于日志传送

限制和局限

无法删除系统数据库

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. 删除多个数据库

适用于:SQL Server 2008 (10.0.x) 及更高版本。

以下示例删除每个列出的数据库。

DROP DATABASE Sales, NewSales;

C. 删除数据库快照

适用于:SQL Server 2008 (10.0.x) 及更高版本。

以下示例在不影响源数据库的情况下,删除名为 sales_snapshot0600 的数据库快照。

DROP DATABASE sales_snapshot0600;

D. 确认存在数据库后删除数据库

下面的示例首先检查是否存在名为 Sales 的数据库。 如果存在,该示例会将名为 Sales 的数据库更改为单用户模式,以强制断开所有其他会话的连接,然后删除该数据库。 有关 SINGLE_USER 的详细信息,请参阅 ALTER DATABASE SET 选项

USE tempdb;
GO
DECLARE @SQL 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;';
    EXEC (@SQL);
END;

另请参阅