sp_detach_db (Transact-SQL)

Se aplica a:SQL Server

Separa una base de datos que actualmente no se está utilizando de una instancia del servidor y, opcionalmente, ejecuta UPDATE STATISTICS en todas las tablas antes de la separación.

Importante

Para separar una base de datos replicada, se debe anular su publicación. Para obtener más información, vea la sección “Comentarios” más adelante en este tema.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

[ @dbname = ] 'database_name' Es el nombre de la base de datos que se va a desasociar. database_name es un valor sysname , con un valor predeterminado de NULL.

[ @skipchecks = ] 'skipchecks' Especifica si se omitirá o ejecutar UPDATE STATISTIC. skipchecks es un valor nvarchar(10), con un valor predeterminado de NULL. Para omitir UPDATE STATISTICS, especifique true. Para ejecutar explícitamente UPDATE STATISTICS, especifique false.

De forma predeterminada, UPDATE STATISTICS se ejecuta para actualizar información acerca de los datos de las tablas e índices. Ejecutar UPATE STATISTICS es útil para las bases de datos que se trasladan a medios de solo lectura.

[ @keepfulltextindexfile = ] 'KeepFulltextIndexFile' Especifica que el archivo de índice de texto completo asociado a la base de datos que se va a desasociar no se quitará durante la operación de desasociación de la base de datos. KeepFulltextIndexFile es un valor nvarchar(10) con un valor predeterminado de true. Si KeepFulltextIndexFile es false, se quitan todos los archivos de índice de texto completo asociados a la base de datos y los metadatos del índice de texto completo, a menos que la base de datos sea de solo lectura. Si es NULL o true, se conservan los metadatos relacionados con texto completo.

Importante

El parámetro @keepfulltextindexfile se quitará en una versión futura de SQL Server. No use este parámetro en nuevos trabajos de desarrollo, y modifique lo antes posible las aplicaciones que lo usen actualmente.

Valores de código de retorno

0 (correcto) o 1 (error)

Conjuntos de resultados

None

Observaciones

Cuando se desasocia una base de datos, todos sus metadatos se eliminan. Si la base de datos era la base de datos predeterminada de cualquier cuenta de inicio de sesión, master se convierte en su base de datos predeterminada.

Nota:

Para obtener información sobre cómo ver la base de datos predeterminada de todas las cuentas de inicio de sesión, consulte sp_helplogins (Transact-SQL). Si tiene los permisos necesarios, puede usar ALTER LOGIN para asignar una nueva base de datos predeterminada a un inicio de sesión.

Restricciones

No se puede separar una base de datos si se da alguna de estas circunstancias:

  • Se está utilizando la base de datos actualmente. Para obtener más información, vea "Obtener acceso exclusivo" más adelante en este tema.

  • Si está replicada, la base de datos está publicada.

    Para poder desasociar la base de datos, debe deshabilitar la publicación ejecutando sp_replicationdboption.

    Nota:

    Si no puede usar sp_replicationdboption, puede quitar la replicación ejecutando sp_removedbreplication.

  • Existe una instantánea de base de datos en la base de datos.

    Para poder separar la base de datos, debe quitar todas sus instantáneas. Para obtener más información, vea Quitar una instantánea de base de datos (Transact-SQL).

    Nota:

    No puede separar ni adjuntar una instantánea de base de datos.

  • Se está creando un reflejo de la base de datos.

    La base de datos no se puede separar hasta que finalice la sesión de creación de reflejo de la base de datos. Para obtener más información, vea Quitar la creación de reflejo de la base de datos (SQL Server).

  • La base de datos es sospechosa.

    Las bases de datos sospechosas se deben poner en el modo de emergencia para poder desasociar la base de datos. Para obtener más información sobre cómo colocar una base de datos en modo de emergencia, vea ALTER DATABASE (Transact-SQL).

  • La base de datos es una base de datos del sistema.

Obtener acceso exclusivo

Separar una base de datos requiere acceso exclusivo a la misma. Si la base de datos que desea separar está en uso, para poder separarla debe establecer la base de datos en modo SINGLE_USER para obtener acceso exclusivo.

Antes de establecer la base de datos como SINGLE_USER, compruebe que la opción AUTO_UPDATE_STATISTICS_ASYNC está establecida en OFF. Cuando esta opción se establece en ON, el subproceso en segundo plano que se usa para actualizar las estadísticas realiza una conexión con la base de datos y no se podrá tener acceso a la base de datos en modo de usuario único. Para obtener más información, consulte Establecimiento de una base de datos en modo de usuario único.

Por ejemplo, la siguiente ALTER DATABASE instrucción obtiene acceso exclusivo a la base de datos AdventureWorks2022 después de que todos los usuarios actuales se desconecten de la base de datos.

USE master;  
ALTER DATABASE AdventureWorks2022  
SET SINGLE_USER;  
GO  

Nota:

Para forzar que los usuarios actuales salgan de la base de datos inmediatamente o dentro de un número especificado de segundos, use también la opción ROLLBACK: ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK rollback_option. Para obtener más información, consulte ALTER DATABASE (Transact-SQL).

Volver a adjuntar una base de datos

Los archivos separados permanecen y se pueden volver a adjuntar utilizando CREATE DATABASE (con la opción FOR ATTACH o FOR ATTACH_REBUILD_LOG). Los archivos se pueden mover a otro servidor y adjuntarse allí.

Permisos

Requiere la pertenencia al rol fijo de servidor sysadmin o la pertenencia al rol db_owner de la base de datos.

Ejemplos

En el ejemplo siguiente se desasocia la base de datos AdventureWorks2022 con skipchecks establecido en true.

EXEC sp_detach_db 'AdventureWorks2022', 'true';  

En el ejemplo siguiente se desasocia la base de datos AdventureWorks2022 y se mantienen los archivos de índice de texto completo y los metadatos del índice de texto completo. Este comando ejecuta UPDATE STATISTICS, que es el comportamiento predeterminado.

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

Consulte también

ALTER DATABASE (Transact-SQL)
Adjuntar y separar bases de datos (SQL Server)
CREATE DATABASE (Transact-SQL de SQL Server)
Separar una base de datos