24

Tôi có DataBase với Nhà môi giới dịch vụ được bật. Sau đó, tôi muốn khôi phục lại cơ sở dữ liệu của tôi trong chương trình từ bản sao lưu cơ sở dữ liệu khác, nhưng sau khi khôi phục (tôi khôi phục vào tên cơ sở dữ liệu hiện có), phương pháp của tôi, whitch phép dịch vụ môi giới, đặt lỗi này:Bật nhà môi giới sau khi khôi phục Sql Server DataBase

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. 

Đây là phương pháp của tôi :

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

Tôi nên sửa gì ở đây?

Trả lời

5

Tôi tìm thấy một giải pháp rất đơn giản cho rằng- chỉ simlpy gán môi giới dịch vụ mới, như thế này:

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

Quy trình giết chết là đáng tin cậy và không nhất thiết phải giết chết ngay lập tức. Sử dụng tốt hơn 'WITH ROLLBACK IMMEDIATE'. – usr

8

Mọi cơ sở dữ liệu đều có một ID duy nhất được sử dụng bởi Nhà môi giới dịch vụ. ID này phải là duy nhất trên tất cả các cơ sở dữ liệu trong một cá thể Sql Server (tốt, nó phải là duy nhất trên toàn cầu, nhưng Sql Server không có cách nào để thực thi điều đó). Khi bạn khôi phục cơ sở dữ liệu, bạn có tùy chọn vô hiệu hóa Nhà môi giới dịch vụ trong cơ sở dữ liệu đã khôi phục, cho phép nó với GUID của cơ sở dữ liệu sao lưu (để nó có thể xử lý thông báo từ cơ sở dữ liệu đã sao lưu) hoặc gán cho nó một GUID mới . Bạn đang cố gắng thực hiện tùy chọn thứ hai trong khi vẫn có cơ sở dữ liệu cũ xung quanh và bạn gặp phải xung đột GUID.

Xem here để biết thêm thông tin.

57

giữ một lưu ý của các tùy chọn này

ALTER DATABASE mydb SET ENABLE_BROKER 

ALTER DATABASE mydb SET DISABLE_BROKER 

ALTER DATABASE mydb SET NEW_BROKER 

nếu bạn đang nhận được một cái gì đó như thế này là đã là Nhà môi giới dịch vụ được bật có cùng ID, hãy truy cập NEW_BROKER

20
ALTER DATABASE [Database_name] SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

Điều này sẽ tạo nhà môi giới dịch vụ mới

0

Chạy truy vấn này để tìm hiểu cơ sở dữ liệu nào khác đang sử dụng cùng một nhà môi giới dịch vụ làm cơ sở dữ liệu bạn đang sử dụng (ví dụ: cho một cơ sở dữ liệu được gọi là 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'); 

... lợi nhuận ...

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 

Sau đó chạy các truy vấn sau đây để có được một nhà môi giới mới cho cơ sở dữ liệu của bạn ...

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

Chạy truy vấn đầu tiên một lần nữa và cơ sở dữ liệu của bạn nên là người duy nhất trong danh sách ...

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

... hiện trả về ...

name, is_broker_enabled, service_broker_guid 
DATABASE_NAME, 1, ASJCBUHBC-7UIOSUI-IUGGUI87-IUGHUIG