sp_detach_db (Transact-SQL)

适用范围:SQL Server

分离当前未从服务器实例中使用的数据库,并且(可选)在分离之前在所有 UPDATE STATISTICS 表上运行。

要分离复制的数据库,该数据库必须是未发布的数据库。 有关详细信息,请参阅本文后面的“ 备注 ”部分。

Transact-SQL 语法约定

语法

sp_detach_db
    [ [ @dbname = ] N'dbname' ]
    [ , [ @skipchecks = ] N'skipchecks' ]
    [ , [ @keepfulltextindexfile = ] N'keepfulltextindexfile' ]
[ ; ]

参数

[ @dbname = ] N'dbname'

要分离的数据库的名称。 @dbname为 sysname,默认值为 NULL.

[ @skipchecks = ] N'skipchecks'

指定是跳过还是运行 UPDATE STATISTICS@skipchecks为 nvarchar(10),默认值为 NULL. 若要跳过 UPDATE STATISTICS,请指定 true。 若要显式运行 UPDATE STATISTICS,请指定 false

默认情况下, UPDATE STATISTICS 执行该操作以更新有关表和索引中的数据的信息。 执行 UPDATE STATISTICS 对于要移动到只读媒体的数据库非常有用。

[ @keepfulltextindexfile = ] N'keepfulltextindexfile'

指定在数据库分离操作期间不会删除与要分离的数据库关联的全文索引文件。 @keepfulltextindexfile为 nvarchar(10),默认值为 true.

  • 如果@keepfulltextindexfilefalse,则删除与数据库关联的所有全文索引文件和全文索引的元数据,除非数据库是只读的。
  • 如果 NULLtrue保留与全文相关的元数据。

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

返回代码值

0(成功)或 1(失败)。

结果集

无。

注解

分离数据库时,会删除其所有元数据。 如果数据库是任何登录帐户的默认数据库, master 则成为其默认数据库。

注意

有关如何查看所有登录帐户的默认数据库的信息,请参阅 sp_helplogins。 如果拥有所需的权限,可以使用 ALTER LOGIN 将新的默认数据库分配给登录名。

限制

如果存在以下任一情况,则无法分离数据库:

  • 该数据库当前正在使用。 有关详细信息,请参阅 “获取独占访问权限”。

  • 如果已进行复制,则数据库已发布。

    在分离数据库之前,必须通过运行 sp_replicationdboption来禁用发布。

    如果无法使用 sp_replicationdboption,可以通过运行 sp_removedbreplication 删除复制。

  • 数据库中存在数据库快照。

    必须首先删除所有数据库快照,然后才能分离数据库。 有关详细信息,请参阅 “删除数据库快照”。

    不能分离或附加数据库快照。

  • 该数据库正在进行镜像。

    在数据库镜像会话终止之前,无法分离数据库。 有关详细信息,请参阅删除数据库镜像 (SQL Server)

  • 数据库处于可疑状态。

    您必须先将可疑数据库设为紧急模式,然后才能对其进行分离。 有关如何将数据库置于紧急模式的详细信息,请参阅 ALTER DATABASE

  • 数据库为系统数据库。

获取独占访问权限

分离数据库需要对数据库有独占访问权限。 如果要分离的数据库正在使用中,在分离数据库之前,请将数据库设置为 SINGLE_USER 模式以获取独占访问权限。

将数据库 SINGLE_USER设置为之前,请验证选项 AUTO_UPDATE_STATISTICS_ASYNC 是否已设置为 OFF。 如果此选项设置为 ON,则用于更新统计信息的后台线程会与数据库建立连接,并且无法在单用户模式下访问数据库。 有关更多信息,请参阅“将数据库设置为单用户模式”。

例如,在当前用户与数据库断开连接后,以下 ALTER DATABASE 语句将获取对 AdventureWorks2022 数据库的独占访问权限。

USE master;
ALTER DATABASE AdventureWorks2022
SET SINGLE_USER;
GO

若要立即或指定秒内强制当前用户退出数据库,也可以使用此选项 ROLLBACK

ALTER DATABASE <database_name>
SET SINGLE_USER
WITH ROLLBACK <rollback_option>;

有关详细信息,请参阅 ALTER DATABASE

重新附加数据库

分离的文件将保留,可以使用(或FOR ATTACHFOR ATTACH_REBUILD_LOG选项)重新附加CREATE DATABASE文件。 这些文件可以移动并附加到其他服务器上。

权限

要求 sysadmin 固定服务器角色的成员身份或数据库db_owner角色的成员身份。

示例

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。

以下示例将AdventureWorks2022@skipchecks设置为 true/&@skipchecks 分离数据库。

EXEC sp_detach_db 'AdventureWorks2022', 'true';

以下示例将分离 AdventureWorks2022 数据库,并保留全文索引文件和全文索引的元数据。 此命令将运行 UPDATE STATISTICS,这是默认行为。

EXEC sp_detach_db @dbname = 'AdventureWorks2022',
    @keepfulltextindexfile = 'true';