sp_detach_db (Transact-SQL)

Se aplica a: SQL Server

Desasocia una base de datos que actualmente no está en uso de una instancia de servidor y, opcionalmente, se ejecuta UPDATE STATISTICS en todas las tablas antes de desasociar.

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 artículo.

Convenciones de sintaxis de Transact-SQL

Sintaxis

sp_detach_db
    [ [ @dbname = ] N'dbname' ]
    [ , [ @skipchecks = ] N'skipchecks' ]
    [ , [ @keepfulltextindexfile = ] N'keepfulltextindexfile' ]
[ ; ]

Argumentos

[ @dbname = ] N'dbname'

Nombre de la base de datos que se va a desasociar. @dbname es sysname, con un valor predeterminado de NULL.

[ @skipchecks = ] N'skipchecks'

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

De forma predeterminada, UPDATE STATISTICS se realiza para actualizar información sobre los datos de las tablas e índices. UPDATE STATISTICS La realización es útil para las bases de datos que se van a mover a medios de solo lectura.

[ @keepfulltextindexfile = ] N'keepfulltextindexfile'

Especifica que el archivo de índice de texto completo asociado a la base de datos que se está desasociando no se quita durante la operación de desasociación de la base de datos. @keepfulltextindexfile es 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 NULL es o true, se conservan los metadatos relacionados con texto completo.

Importante

Esta característica se quitará en una versión futura de SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan.

Valores de código de retorno

0 (correcto) o 1 (erróneo).

Conjunto de resultados

Ninguno.

Comentarios

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. Si tiene los permisos necesarios, puede usar ALTER LOGIN para asignar una nueva base de datos predeterminada a un inicio de sesión.

Limitaciones

Una base de datos no se puede desasociar si se cumple alguna de las siguientes condiciones:

  • Se está utilizando la base de datos actualmente. Para obtener más información, consulte Obtener acceso exclusivo.

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

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

    Si no puedes usar sp_replicationdboption, puedes quitar la replicación si ejecutas 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.

    No puedes 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 desasociar 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, consulte ALTER DATABASE.

  • 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 desasociar está en uso, antes de poder desasociarla, establezca la base de datos SINGLE_USER en modo para obtener acceso exclusivo.

Antes de establecer la base de datos SINGLE_USERen , compruebe que la AUTO_UPDATE_STATISTICS_ASYNC opción está establecida OFFen . Cuando esta opción se establece ONen , el subproceso en segundo plano que se usa para actualizar las estadísticas toma una conexión con la base de datos y no puede acceder a la base de datos en modo de usuario único. Para obtener más información, consulta Establecer 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

Para forzar que los usuarios actuales salgan de la base de datos inmediatamente o dentro de un número de segundos especificado, también puede usar la ROLLBACK opción .

ALTER DATABASE <database_name>
SET SINGLE_USER
WITH ROLLBACK <rollback_option>;

Para más información, consulte ALTER DATABASE.

Volver a adjuntar una base de datos

Los archivos desasociados permanecen y se pueden volver a adjuntar mediante CREATE DATABASE (con la FOR ATTACH opción 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 a la pertenencia al rol de db_owner de la base de datos.

Ejemplos

Los ejemplos de código de Transact-SQL de este artículo utilizan la base de datos de ejemplo AdventureWorks2022 o AdventureWorksDW2022, que se pueden descargar desde la página principal de Ejemplos y proyectos de la comunidad de Microsoft SQL Server.

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

EXEC sp_detach_db 'AdventureWorks2022', 'true';

En el ejemplo siguiente se separa la base de datos AdventureWorks2022 y se conservan los archivos 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';