J'ai DataBase avec Service Broker activé. Ensuite, je veux restaurer ma base de données dans le programme à partir de la sauvegarde d'une autre base de données, mais après la restauration (je restaure sur le nom de la base de données existante), ma méthode, qui active Service Broker, met cette erreur:
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.
Voici ma méthode:
public void TurnOnBroker()
{
if (!this.database.BrokerEnabled)
{
this.server.KillAllProcesses(this.database.Name);
this.database.BrokerEnabled = true;
this.database.Alter();
RefreshConnection();
}
}
Que dois-je corriger ici? Des suggestions?
J'ai trouvé une solution très simple pour cela - affectez simplement un nouveau courtier de service, comme ceci:
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();
}
}
noter ces options
ALTER DATABASE mydb SET ENABLE_BROKER
ALTER DATABASE mydb SET DISABLE_BROKER
ALTER DATABASE mydb SET NEW_BROKER
si vous obtenez quelque chose comme ceci est déjà un Service Broker activé avec le même ID, optez pour le NEW_BROKER
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
Cela créera le nouveau courtier de services
Chaque base de données possède un ID unique utilisé par Service Broker. Cet ID doit être unique dans toutes les bases de données d'une instance Sql Server (enfin, il doit être unique à l'échelle mondiale, mais Sql Server n'a aucun moyen de l'imposer). Lorsque vous restaurez une base de données, vous avez la possibilité de désactiver Service Broker dans la base de données restaurée, en l'activant avec le GUID de la base de données sauvegardée (afin qu'il puisse prendre en charge le traitement des messages de la sauvegarde) base de données) ou attribuez-lui un nouveau GUID. Vous essayez de faire la deuxième option alors que vous avez toujours l'ancienne base de données autour et vous rencontrez GUID conflit.
Voir ici pour plus d'informations.
Exécutez cette requête pour découvrir quelles autres bases de données utilisent le même courtier de services que la base de données que vous utilisez (par exemple, pour une base de données appelée 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');
... Retour ...
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
Exécutez ensuite les requêtes suivantes pour obtenir un nouveau courtier pour votre base de données ...
ALTER DATABASE DATABASE_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DATABASE_NAME SET NEW_BROKER;
ALTER DATABASE DATABASE_NAME SET MULTI_USER;
Exécutez à nouveau la première requête et votre base de données devrait être la seule de la liste ...
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');
... revient maintenant ...
name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG