36

ServiceBrokerが有効になっているデータベースがあります。次に、他のデータベースのバックアップからプログラム内のデータベースを復元したいのですが、復元(既存のデータベース名で復元)した後、ServiceBrokerを有効にするメソッドが次のエラーを出します。

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

ここで何を修正する必要がありますか?

4

5 に答える 5

67

これらのオプションをメモしてください

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

このようなものを取得しているのが、同じIDですでに有効になっているサービスブローカーである場合は、NEW_BROKERに移動します

于 2011-06-22T12:15:42.150 に答える
38
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

これにより、新しいサービスブローカーが作成されます

于 2014-09-15T04:29:53.460 に答える
10

すべてのデータベースには、ServiceBrokerが使用する一意のIDがあります。このIDは、SQL Serverインスタンス内のすべてのデータベースで一意である必要があります(グローバルに一意である必要がありますが、SQL Serverにはそれを強制する方法がありません)。データベースを復元する場合、復元されたデータベースでService Brokerを無効にするか、バックアップされたデータベースのGUIDを使用して有効にする(バックアップされたデータベースからメッセージ処理を引き継ぐことができるようにする)か、新しいGUIDを割り当てるかを選択できます。 。古いデータベースがまだ残っていて、GUIDの競合が発生しているときに、2番目のオプションを実行しようとしています。

詳細については、こちらをご覧ください。

于 2010-08-16T17:25:06.053 に答える
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
于 2017-06-06T13:51:17.443 に答える
4

そのための非常に簡単な解決策を見つけました-次のように、新しいサービスブローカーを簡単に割り当てます。

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();
        }
    }
于 2010-08-17T09:07:51.567 に答える