sp_attach_db (Transact-SQL)

将数据库附加到服务器。

重要说明重要提示

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。,我们建议您改用 CREATE DATABASE database_name FOR ATTACH。 有关详细信息,请参阅 CREATE DATABASE (Transact-SQL)

注意注意

若要在一个或多个日志文件有新位置的情况下重新生成多个日志文件,请使用 CREATE DATABASE database_name FOR ATTACH_REBUILD_LOG。

安全说明安全说明

建议您不要附加或还原来自未知或不可信源的数据库。 此类数据库可能包含恶意代码,这些代码可能会执行非预期的 Transact-SQL 代码,或者通过修改架构或物理数据库结构导致错误。 在使用未知或不可信源中的数据库之前,请在非生产服务器中的数据库上运行 DBCC CHECKDB,同时检查数据库中的代码(例如,存储过程或其他用户定义代码)。

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

语法

sp_attach_db [ @dbname= ] 'dbname'
    , [ @filename1= ] 'filename_n' [ ,...16 ] 

参数

  • [ @dbname= ] **'**dbnam '
    要附加到该服务器的数据库的名称。 该名称必须是唯一的。 dbname 的数据类型为 sysname,默认值为 NULL。

  • [ @filename1= ] 'filename_n'
    数据库文件的物理名称,包括路径。 filename_n 的数据类型为 nvarchar(260),默认值为 NULL。 最多可以指定 16 个文件名。 参数名称从 @filename1 开始,一直增加到 @filename16。 文件名列表至少必须包括主文件。 主文件中包含指向数据库中其他文件的系统表。 该列表还必须包括在数据库分离之后移动的所有文件。

    注意注意

    此参数映射到 CREATE DATABASE 语句的 FILENAME 参数。 有关详细信息,请参阅 CREATE DATABASE (Transact-SQL)

    当将包含全文目录文件的 SQL Server 2005 数据库附加到 SQL Server 2012 服务器实例上时,会将目录文件从其以前的位置与其他数据库文件一起附加,这与在 SQL Server 2005 中的情况相同。 有关详细信息,请参阅从 SQL Server 2005 升级全文搜索

返回代码值

0(成功)或 1(失败)

结果集

注释

只应对以前使用显式 sp_detach_db 操作从数据库服务器分离的数据库或复制的数据库执行 sp_attach_db 存储过程。 如果必须指定 16 个以上的文件,请使用 CREATE DATABASE database_name FOR ATTACH 或 CREATE DATABASE database_name FOR_ATTACH_REBUILD_LOG。 有关详细信息,请参阅 CREATE DATABASE (Transact-SQL)

假设所有未指定文件都位于其上次的已知位置。 若要使用不同位置的文件,则必须指定新位置。

无法在早期版本的 SQL Server 中附加由较新版本的 SQL Server 创建的数据库。

注意注意

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

当您附加已复制的数据库而不是分离的数据库时,请注意以下事项:

  • 如果将数据库附加到与原始数据库相同的服务器实例和版本,则不需要执行其他步骤。

  • 如果您将数据库附加到同一个服务器实例,但是版本已升级,则必须执行 sp_vupgrade_replication 才能在附加操作完成后升级复制。

  • 如果您将数据库附加到不同的服务器实例,而不考虑版本,则必须执行 sp_removedbreplication 才能在附加操作完成后删除复制。

只有 SQL Server 2005 和更高版本的数据库才能附加到 SQL Server 2012。 如果某个数据库的兼容级别小于 90,则在数据库附加到 SQL Server 2012 时,其兼容级别将更改为级别 90。

当数据库第一次附加或还原到新的 SQL Server 实例时,数据库主密钥(由服务主密钥加密)的副本尚未存储在服务器中。 必须使用 OPEN MASTER KEY 语句解密数据库主密钥 (DMK)。 一旦 DMK 解密后,通过使用 ALTER MASTER KEY REGENERATE 语句向服务器提供 DMK(使用服务主密钥 (SMK) 加密)的副本,即可拥有将来启用自动解密的选项。 当数据库已从较早版本升级后,应重新生成 DMK 以使用更新的 AES 算法。 有关重新生成 DMK 的详细信息,请参阅 ALTER MASTER KEY (Transact-SQL)。 重新生成 DMK 密钥以升级到 AES 所需的时间取决于 DMK 保护的对象数。 重新生成 DMK 密钥以升级到 AES 只在必需时执行一次,不影响将来作为密钥循环策略的一部分而重新生成的过程。

权限

有关在附加数据库时如何处理权限的信息,请参阅 CREATE DATABASE (Transact-SQL)

示例

下例将 AdventureWorks2012 中的文件附加到当前服务器。

EXEC sp_attach_db @dbname = N'AdventureWorks2012', 
    @filename1 = 
N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\AdventureWorks2012_Data.mdf', 
    @filename2 = 
N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Data\AdventureWorks2012_log.ldf';

请参阅

参考

sp_detach_db (Transact-SQL)

sp_helpfile (Transact-SQL)

sp_removedbreplication (Transact-SQL)

系统存储过程 (Transact-SQL)

概念

数据库分离和附加 (SQL Server)