Включение брокера после восстановления базы данных Sql Server

У меня есть база данных с включенным Service Broker. Затем я хочу восстановить свою базу данных в программе из резервной копии другой базы данных, но после восстановления (я восстанавливаю существующее имя базы данных) мой метод, whitch позволяет Service Broker, помещает эту ошибку:

    Msg 9772, Level 16, State 1, Line 1
The Service Broker in database "ServeDB2" cannot be enabled because there is already an enabled Service Broker with the same ID.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.

Это мой метод:

public void TurnOnBroker()
{
    if (!this.database.BrokerEnabled)
    {
        this.server.KillAllProcesses(this.database.Name);
        this.database.BrokerEnabled = true;
        this.database.Alter();
        RefreshConnection();
    }
}

Что я должен здесь исправить? Любые предложения?

Ответ 1

Я нашел очень простое решение для этого: просто попробуйте назначить нового сервис-брокера, например:

public void TurnOnBroker()
    {
        if (!this.database.BrokerEnabled)
        {
            this.server.KillAllProcesses(this.database.Name);

            string brokerCommand = String.Format("ALTER DATABASE {0} SET NEW_BROKER", this.database.Name);
            this.database.ExecuteNonQuery(brokerCommand);

            RefreshConnection();
        }
    }

Ответ 2

сохраните примечание этих параметров

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

Если вы получаете что-то вроде этого, это уже включенный сервисный брокер с тем же идентификатором, идите в NEW_BROKER

Ответ 3

ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

Это создаст новый сервисный брокер

Ответ 4

Каждая база данных имеет уникальный идентификатор, используемый Service Broker. Этот идентификатор должен быть уникальным для всех баз данных в экземпляре сервера Sql (ну, он должен быть уникальным в глобальном масштабе, но Sql Server не имеет возможности обеспечить его выполнение). Когда вы восстанавливаете базу данных, у вас есть возможность отключить Service Broker в восстановленной базе данных, включив ее с GUID резервной базы данных (чтобы она могла перехватить обработку сообщений из резервной базы данных) или назначить ей новый GUID, Вы пытаетесь сделать второй вариант, пока у вас все еще есть старая база данных, и вы столкнулись с конфликтом GUID.

Подробнее см. здесь.

Ответ 5

Запустите этот запрос, чтобы узнать, какие другие базы данных используют тот же сервисный брокер, что и база данных, которую вы используете (например, для базы данных под названием DATABASE_NAME)...

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases 
WHERE service_broker_guid IN (SELECT service_broker_guid FROM sys.databases where name = 'DATABASE_NAME');

... возвращает...

name, is_broker_enabled, service_broker_guid
DATABASE_NAME_OTHER, 1, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
DATABASE_NAME_ANOTHER, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV
DATABASE_NAME, 0, KBHDBVJH-SDVHIOHD-SODIVDIOH-UHDSV

Затем запустите следующие запросы для получения нового брокера для вашей базы данных...

ALTER DATABASE DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DATABASE_NAME SET NEW_BROKER;
ALTER DATABASE DATABASE_NAME SET MULTI_USER;

Запустите первый запрос еще раз, и ваша база данных должна быть единственной в списке...

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases 
WHERE service_broker_guid IN (SELECT service_broker_guid FROM sys.databases where name = 'DATABASE_NAME');

... теперь возвращается...

name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG