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 2008 R2 服务器实例上时,会将目录文件从其以前的位置与其他数据库文件一起附加,这与在 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 才能在附加操作完成后删除复制。

源数据库的版本必须至少为 80 (SQL Server 2000),才能附加到 SQL Server 2008 R2 或 SQL Server 2008。附加兼容级别低于 80 的 SQL Server 2000 或 SQL Server 2005 数据库时,会将其兼容级别设置为 80。

权限

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

示例

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

EXEC sp_attach_db @dbname = N'AdventureWorks2008R2', 
    @filename1 = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\AdventureWorks2008R2_Data.mdf', 
    @filename2 = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\AdventureWorks2008R2_log.ldf';