sp_attach_db (Transact-SQL)

适用范围:SQL Server

将数据库附加到服务器。

重要

在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 建议改用 CREATE DATABASE <database_name> FOR ATTACH 。 有关详细信息,请参阅 CREATE DATABASE。 若要在一个或多个具有新位置时重新生成多个日志文件,请使用 CREATE DATABASE <database_name> FOR ATTACH_REBUILD_LOG

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

语法

sp_attach_db
    [ @dbname = ] N'dbname'
    , [ { @filename1 ... @filename16 } = ] { N'*filename1*' ... N'*filename16*' }
[ ; ]

参数

[ @dbname = ] N'dbname'

要附加到服务器的数据库的名称。 @dbname为 sysname,无默认值。

[ { @filename1 ... @filename16 } = ] { N'filename1' ...N'filename16' }

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

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

注意

将包含全文目录文件的 SQL Server 2005 (9.x) 数据库附加到较新版本的 SQL Server 时,目录文件与 SQL Server 2005(9.x)中的相同, 有关详细信息,请参阅 全文搜索升级

返回代码值

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

结果集

无。

注解

sp_attach_db仅应在以前使用显式sp_detach_db操作或复制的数据库上分离的数据库上执行存储过程。 如果必须指定 16 个以上的文件,请使用 CREATE DATABASE <database_name> FOR ATTACHCREATE DATABASE <database_name> FOR_ATTACH_REBUILD_LOG。 有关详细信息,请参阅 CREATE DATABASE

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

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

注意

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

附加复制的数据库而不是分离时,请考虑以下条件:

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

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

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

当数据库首次附加或还原到 SQL Server 的新实例时,服务主密钥(SMK)加密的数据库主密钥(DMK)的副本尚未存储在服务器中。 必须使用 OPEN MASTER KEY 该语句来解密 DMK。 解密 DMK 后,可以使用语句向服务器提供使用 SMK 加密的 DMK 副本,从而在将来 ALTER MASTER KEY REGENERATE 启用自动解密。 从早期版本升级数据库时,应重新生成 DMK 以使用较新的 AES 算法。 有关重新生成 DMK 的详细信息,请参阅 ALTER MASTER KEY。 重新生成 DMK 密钥以升级到 AES 所需的时间取决于 DMK 保护的对象数。 重新生成要升级到 AES 的 DMK 密钥只需一次,并且不会影响将来的重新生成作为密钥轮换策略的一部分。

权限

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

示例

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

EXEC sp_attach_db @dbname = N'AdventureWorks2022',
    @filename1 =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks2022_Data.mdf',
    @filename2 =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks2022_log.ldf';