sp_detach_db (Transact-SQL)

更新日期: 2006 年 12 月 12 日

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

ms188031.note(zh-cn,SQL.90).gif重要提示:
要分离复制的数据库,该数据库必须是未发布的数据库。有关详细信息,请参阅本主题后面的“备注”部分。

主题链接图标Transact-SQL 语法约定

语法

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

参数

  • [ @dbname=] 'database_name'
    要分离的数据库的名称。database_namesysname 值,默认值为 NULL。
  • [ @skipchecks = ] 'skipchecks'
    指定跳过还是运行 UPDATE STATISTIC。skipchecksnvarchar(10) 值,默认值为 NULL。若要跳过 UPDATE STATISTICS,请指定 true。若要显式运行 UPDATE STATISTICS,请指定 false

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

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

返回代码值

0(成功)或 1(失败)

结果集

备注

限制

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

  • 该数据库当前正在使用。有关详细信息,请参阅本主题后面的“获取独占访问权限”。
  • 如果已进行复制,则数据库已发布。
    必须先运行 sp_replicationdboption 禁用发布,然后才能分离数据库。
    ms188031.note(zh-cn,SQL.90).gif注意:
    如果无法使用 sp_replicationdboption,可以通过运行 sp_removedbreplication 删除复制。
  • 数据库中存在数据库快照。
    必须首先删除所有数据库快照,然后才能分离数据库。有关详细信息,请参阅如何删除数据库快照 (Transact-SQL)
    ms188031.note(zh-cn,SQL.90).gif注意:
    不能分离或附加数据库快照。
  • 该数据库正在进行镜像。
    在终止数据库镜像会话之间,无法分离该数据库。有关详细信息,请参阅删除数据库镜像
  • 数据库处于可疑状态。
    在 SQL Server 2005 中,必须先将可疑数据库置于紧急模式下,然后才能分离该数据库。有关如何将数据库置于紧急模式下的详细信息,请参阅 ALTER DATABASE (Transact-SQL)
  • 数据库为系统数据库。

分离数据库的操作将清除 SQL Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能导致查询性能暂时性地突然降低。在 SQL Server 2005 Service Pack 2 中,对于计划缓存中的各个已清除的缓存存储区而言,SQL Server 错误日志将包含以下信息性消息:“由于某些数据库维护或重新配置操作,SQL Server 经历了 '%s' 缓存存储区(计划缓存的一部分)的 %d 次刷新。”只要每五分钟刷新一次缓存,此消息就将每五分钟记录一次。

获取独占访问权限

分离数据库需要对数据库有独占访问权限。如果要分离的数据库正在使用当中,则必须先将该数据库设置为 SINGLE_USER 模式以获取独占访问权限,然后才能对其进行分离。

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

USE master;
ALTER DATABASE AdventureWorks
SET SINGLE_USER;
GO
ms188031.note(zh-cn,SQL.90).gif注意:
若要强制当前用户即刻离开数据库或在指定的秒数内离开数据库,请外加使用 ROLLBACK 选项:ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option。有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)

重新附加数据库

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

权限

要求具有 db_owner 固定数据库角色中的成员资格。

示例

以下示例对 skipchecks 设置为 True 的 AdventureWorks 数据库进行分离。

EXEC sp_detach_db 'AdventureWorks', 'true';

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

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

请参阅

参考

ALTER DATABASE (Transact-SQL)
CREATE DATABASE (Transact-SQL)

其他资源

分离数据库和附加数据库
保护数据和日志文件的安全
如何分离数据库 (SQL Server Management Studio)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

新增内容:
  • 在“备注”中添加了有关清除计划缓存的部分。
更改的内容
  • 明确了 @keepfulltextindexfile 参数的设置。

2006 年 7 月 17 日

新增内容:
  • 添加了禁止分离系统数据库的限制。

2006 年 4 月 14 日

新增内容:
  • 添加了使用 @keepfulltextindexfile 的示例。
更改的内容
  • @KeepFulltextIndexFile 改为 @keepfulltextindexfile

2005 年 12 月 5 日

新增内容:
  • 添加了运行 sp_detach_db 之前不能正在使用数据库的限制,以及有关获取独占访问权限的部分。