DROP DATABASE (Transact-SQL)

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

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

Transact-SQL 语法约定

语法

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 DATABASEDROP 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