У меня есть база данных с включенным компонентом Service Broker. Затем я хочу восстановить свою базу данных в программе из резервной копии другой базы данных, но после восстановления (я восстанавливаю по существующему имени базы данных) мой метод, включающий компонент 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();
}
}
Что мне здесь исправить? Любые предложения?
Я нашел для этого очень простое решение - просто назначьте нового брокера служб, например:
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();
}
}
Каждая база данных имеет уникальный идентификатор, используемый Service Broker. Этот идентификатор должен быть уникальным для всех баз данных в экземпляре Sql Server (ну, он должен быть уникальным в глобальном масштабе, но у Sql Server нет способа обеспечить это). При восстановлении базы данных у вас есть возможность отключить компонент Service Broker в восстановленной базе данных, включив его с помощью GUID резервной базы данных (чтобы он мог выполнять обработку сообщений из резервной базы данных) или назначить ему новый GUID. . Вы пытаетесь выполнить второй вариант, пока у вас все еще есть старая база данных, и вы сталкиваетесь с конфликтом GUID.
См. здесь для получения дополнительной информации.