Поделиться через


sp_detach_db (Transact-SQL)

Область применения: SQL Server

Отсоединяет базу данных, которая в настоящее время не используется от экземпляра сервера, а при необходимости выполняется UPDATE STATISTICS во всех таблицах перед отключением.

Перед отсоединением реплицируемой базы данных ее публикация должна быть прекращена. Дополнительные сведения см. в разделе "Примечания" далее в этой статье.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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

Аргументы

[ @dbname = ] N'dbname'

Имя отсоединяемой базы данных. @dbname — sysname с значением по умолчаниюNULL.

[ @skipchecks = ] N'skipchecks'

Указывает, следует ли пропускать или запускать UPDATE STATISTICS. @skipchecks — nvarchar(10) с значением по умолчаниюNULL. Чтобы пропустить UPDATE STATISTICS, укажите true. Для явного выполнения UPDATE STATISTICSукажите false.

По умолчанию UPDATE STATISTICS выполняется обновление сведений о данных в таблицах и индексах. UPDATE STATISTICS Выполнение полезно для баз данных, которые необходимо переместить на носитель только для чтения.

[ @keepfulltextindexfile = ] N'keepfulltextindexfile'

Указывает, что файл полнотекстового индекса, связанный с отсоединяемой базой данных, не удаляется во время операции отсоединения базы данных. @keepfulltextindexfile — nvarchar(10) с значением по умолчаниюtrue.

  • Если @keepfulltextindexfilefalse, все файлы полнотекстового индекса, связанные с базой данных, и метаданные полнотекстового индекса удаляются, если база данных не доступна только для чтения.
  • Если NULL или trueсохраняется полнотекстовые метаданные, связанные с ним.

Внимание

Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

Значения кода возврата

0 (успешно) или 1 (сбой).

Результирующий набор

Нет.

Замечания

При отсоединении базы данных все метаданные удаляются. Если база данных была базой данных по умолчанию для любых учетных записей входа, master становится их базой данных по умолчанию.

Примечание.

Сведения о просмотре базы данных по умолчанию всех учетных записей входа см. в sp_helplogins. Если у вас есть необходимые разрешения, можно использовать ALTER LOGIN для назначения новой базы данных по умолчанию для входа.

Ограничения

Невозможно отключить базу данных, если одно из следующих значений имеет значение true:

  • База данных в настоящий момент используется. Дополнительные сведения см. в разделе "Получение эксклюзивного доступа".

  • При репликации база данных публикуется.

    Перед отключением базы данных необходимо отключить публикацию, выполнив sp_replicationdboption.

    Если вы не можете использовать sp_replicationdboption, можно удалить репликацию, выполнив sp_removedbreplication.

  • Имеется моментальный снимок базы данных.

    Перед отсоединением базы данных необходимо удалить все моментальные снимки. Дополнительные сведения см. в разделе "Удаление моментального снимка базы данных".

    Моментальный снимок базы данных не может быть отключен или присоединен.

  • Выполняется зеркальное отображение базы данных.

    База данных не может быть отключена до завершения сеанса зеркального отображения базы данных. Дополнительные сведения см. в разделе Удаление зеркального отображения базы данных (SQL Server).

  • База данных помечена как подозрительная.

    Подозрительную базу данных необходимо перевести в аварийный режим перед ее отсоединением. Дополнительные сведения о том, как поместить базу данных в аварийный режим, см. в разделе ALTER DATABASE.

  • База данных является системной базой данных.

Получение эксклюзивного доступа

Для отсоединения базы данных требуется монопольный доступ к ней. Если база данных, которую вы хотите отсоединить, используется, прежде чем отсоединить ее, установите для базы данных SINGLE_USER режим, чтобы получить монопольный доступ.

Перед настройкой базы данных SINGLE_USERубедитесь, что AUTO_UPDATE_STATISTICS_ASYNC для параметра задано значение OFF. Если этот параметр задан ON, фоновый поток, используемый для обновления статистики, принимает подключение к базе данных, и вы не сможете получить доступ к базе данных в однопользовательском режиме. Дополнительные сведения см. в разделе "Настройка базы данных в однопользовательском режиме".

Например, следующая ALTER DATABASE инструкция получает монопольный доступ к базе данных AdventureWorks2022 после отключения всех текущих пользователей от базы данных.

USE master;
ALTER DATABASE AdventureWorks2022
SET SINGLE_USER;
GO

Чтобы принудительно вывести текущих пользователей из базы данных сразу или в течение указанного количества секунд, можно также использовать ROLLBACK этот параметр.

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

Дополнительные сведения см. в статье Параметры инструкции ALTER DATABASE для файлов и файловых групп (Transact-SQL).

Повторное присоединение базы данных

Отключенные файлы остаются и могут быть повторно присоединены с помощью CREATE DATABASE (с параметром или FOR ATTACH_REBUILD_LOG параметромFOR ATTACH). Файлы можно также переместить на другой сервер и подсоединить там.

Разрешения

Требуется членство в предопределенных ролях сервера sysadmin или членство в db_owner роли базы данных.

Примеры

Примеры кода Transact-SQL в этой статье используют AdventureWorks2022 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.

В следующем примере база данных отсоединяется AdventureWorks2022 с @skipchecks задано trueзначение .

EXEC sp_detach_db 'AdventureWorks2022', 'true';

В следующем примере отсоединяется база данных AdventureWorks2022 и сохраняются файлы полнотекстового индекса и метаданные полнотекстового индекса. Эта команда выполняет инструкцию UPDATE STATISTICS — такое поведение установлено по умолчанию.

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