sp_detach_db (Transact-SQL)

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

重要说明重要提示

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

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

语法

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

参数

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

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

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

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

    重要说明重要提示

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

返回代码值

0(成功)或 1(失败)

结果集

注释

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

注意注意

有关如何查看所有登录帐户的默认数据库的信息,请参阅 sp_helplogins (Transact-SQL)。如果您拥有所需权限,则可以使用 ALTER LOGIN 指定一个用于登录的新的默认数据库。

限制

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

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

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

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

    注意注意

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

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

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

    注意注意

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

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

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

  • 数据库处于可疑状态。

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

  • 数据库为系统数据库。

获取独占访问权限

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

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

USE master;
ALTER DATABASE AdventureWorks2008R2
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 固定服务器角色的成员身份。

示例

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

EXEC sp_detach_db 'AdventureWorks2008R2', 'true';

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

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