sp_detach_db (Transact-SQL)

适用于:SQL Server

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

重要

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

Transact-SQL 语法约定

语法

  
sp_detach_db [ @dbname= ] 'database_name'   
    [ , [ @skipchecks= ] 'skipchecks' ]   
    [ , [ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' ]   

参数

[ @dbname = ] 'database_name' 要分离的数据库的名称。 database_namesysname 值,默认值为 NULL。

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

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

[ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' 指定在数据库分离操作期间不会删除与要分离的数据库关联的全文索引文件。 KeepFulltextIndexFilenvarchar (10) 值,默认值为 true。 如果 KeepFulltextIndexFilefalse,则删除与数据库关联的所有全文索引文件和全文索引的元数据,除非数据库是只读的。 如果为 NULL 或 true,则保留与全文相关的元数据。

重要

@keepfulltextindexfile 参数将在 SQL Server 的未来版本中删除。 请不要在新的开发工作中使用此参数,并尽快修改当前仍在使用此参数的应用程序。

返回代码值

0(成功)或 1(失败)

结果集

备注

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

注意

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

限制

如果符合下列任一条件,则无法分离数据库:

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

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

    必须先通过运行 sp_replicationdboption 来禁用发布,然后才能分离数据库。

    注意

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

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

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

    注意

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

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

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

  • 数据库处于可疑状态。

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

  • 数据库为系统数据库。

获取独占访问权限

分离数据库需要对数据库有独占访问权限。 如果要分离的数据库正在使用当中,则必须先将该数据库设置为 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 (Transact-SQL)

重新附加数据库

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

权限

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

示例

以下示例分离 AdventureWorks2022 数据库,并将 skipcheck 设置为 true。

EXEC sp_detach_db 'AdventureWorks2022', 'true';  

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

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

另请参阅

ALTER DATABASE (Transact-SQL)
数据库分离和附加 (SQL Server)
CREATE DATABASE (SQL Server Transact-SQL)
分离数据库