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();
}
}
これらのオプションをメモしておいてください
ALTER DATABASE mydb SET ENABLE_BROKER
ALTER DATABASE mydb SET DISABLE_BROKER
ALTER DATABASE mydb SET NEW_BROKER
このようなものを取得しているユーザーが既に同じIDの有効なService Brokerである場合は、NEW_BROKER
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
これにより、新しいサービスブローカーが作成されます
すべてのデータベースには、Service Brokerが使用する一意のIDがあります。このIDは、SQL Serverインスタンスのすべてのデータベースで一意である必要があります(まあ、グローバルに一意である必要がありますが、SQL Serverにはそれを強制する方法がありません)。データベースを復元する場合、復元されたデータベースでService Brokerを無効にし、バックアップされたデータベースのGUIDでそれを有効にするオプションがあります。データベースを作成するか、新しいGUIDを割り当てます。古いデータベースがまだ残っているときに2番目のオプションを実行しようとして、GUID conflict。
詳細については、 here を参照してください。
このクエリを実行して、使用しているデータベースと同じサービスブローカーを使用している他のデータベースを見つけます(たとえば、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