DROP DATABASE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics

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

Transact-SQL 语法约定

语法

SQL Server 语法。

DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ]
[ ; ]

Azure SQL 数据库 and Azure Synapse Analytics syntax.

DROP DATABASE database_name
[ ; ]

参数

如果存在

适用于: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 数据库角色的成员可以删除数据库。

示例

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