web-dev-qa-db-ja.com

SQL Serverデータベースの復元後のブローカーの有効化

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

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

30
vts123

そのための非常にシンプルなソリューションを見つけました。次のように、新しいサービスブローカーを割り当てるだけです。

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

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

ALTER DATABASE mydb SET ENABLE_BROKER

ALTER DATABASE mydb SET DISABLE_BROKER

ALTER DATABASE mydb SET NEW_BROKER

このようなものを取得しているユーザーが既に同じIDの有効なService Brokerである場合は、NEW_BROKER

61
DAEMYO
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

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

30
Rahul Singi

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

詳細については、 here を参照してください。

8
Pawel Marciniak

このクエリを実行して、使用しているデータベースと同じサービスブローカーを使用している他のデータベースを見つけます(たとえば、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
2
Mark Kendrick