Domanda

Ho DataBase con abilitato Service Broker. Poi voglio ripristinare nel database in programma dal backup di altri database, ma dopo il ripristino (I ripristinare il nome del database esistente), il mio metodo, tuute consente Service Broker, pone questo errore:

    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.

Questo è il mio metodo:

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

Cosa devo risolvere qui? Eventuali suggerimenti?

È stato utile?

Soluzione 4

Ho trovato una soluzione molto semplice per che- solo simlpy nuovo service broker assegnare, in questo modo:

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();
        }
    }

Altri suggerimenti

mantenere una nota di queste opzioni

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

se sei sempre qualcosa di simile è già un abilitato Service Broker con lo stesso ID, andare per il NEW_BROKER

ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

Questo creerà il broker nuovo servizio

Ogni database ha un ID univoco utilizzato da Service Broker. Questo ID deve essere univoco in tutti i database in un'istanza di SQL Server (o meglio, dovrebbe essere univoco globale, ma SQL Server non hanno un modo per far rispettare quello). Quando si ripristina un database, si ha la possibilità di disattivare Service Broker nel database ripristinato, consentendo con il GUID del database di backup (in modo che possa prendere in consegna l'elaborazione dei messaggi dal database di backup) o assegnare un nuovo GUID . Stai cercando di fare la seconda opzione mentre hai ancora il vecchio database intorno e si esegue in conflitto GUID.

qui per maggiori informazioni .

Esegui questa query per scoprire quali altri database stanno usando lo stesso broker di servizio come il database in uso (ad esempio per un database chiamato 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');

... ritorna ...

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

Quindi eseguire le seguenti query per ottenere un nuovo mediatore per il database ...

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

Eseguire nuovamente la prima query e il database dovrebbe essere l'unico nella lista ...

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');

... ora torna ...

name, is_broker_enabled, service_broker_guid
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top