複寫管理物件概念
適用於:SQL Server Azure SQL 受控執行個體
復寫管理物件 (RMO) 是一個 Managed 程式代碼元件,可封裝 SQL Server 的復寫功能。 RMO 是由命名空間實作 Microsoft.SqlServer.Replication 。
下列各節中的主題說明如何使用 RMO 以程式設計方式控制複寫工作:
設定散發
本節中的主題說明如何使用 RMO 來設定發佈和散發。
建立發行集
本節中的主題說明如何使用 RMO 來建立、刪除及修改發行集和發行項。
訂閱發行集
本節中的主題說明如何使用 RMO 來建立、刪除和修改訂用帳戶。
保護複寫拓撲
本節中的主題說明如何使用 RMO 來檢視和修改安全性設定。
同步處理訂閱 (複寫)
本節中的主題說明如何同步處理訂閱。
監視複寫
本節中的主題說明如何以程序設計方式監視複製拓撲。
RMO 程式設計簡介
RMO 是針對 SQL Server 複寫的所有層面進行程式設計而設計。 RMO 命名空間是 Microsoft.SqlServer.Replication,而且是由 Microsoft.SqlServer.Rmo.dll 實作,這是Microsoft .NET Framework 元件。 屬於Microsoft.SqlServer.Replication命名空間的 Microsoft.SqlServer.Replication.dll元件會實作 Managed 程式代碼介面,以設計各種復寫代理程式(快照集代理程式、散發代理程式 和 合併代理程式)。 其類別可以從 RMO 存取,以同步處理訂閱。 命名空間中的 Microsoft.SqlServer.Replication.BusinessLogicSupport 類別,由 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll元件實作,可用來建立合併式複寫的自定義商業規則。 此元件與 RMO 無關。
根據 RMO 部署應用程式
RMO 取決於 SQL Server Compact 以外的所有 SQL Server 版本隨附的復寫元件和用戶端聯機組件。 若要根據 RMO 部署應用程式,您必須安裝包含複寫元件和用戶端聯機組件的 SQL Server 版本,該版本會在應用程式執行所在的電腦上。
開始使用 RMO
本節說明如何使用 Visual Studio Microsoft啟動簡單的 RMO 專案。
建立新的 Microsoft Visual C# 專案
啟動 Visual Studio。
在 [ 檔案] 功能表上,按兩下 [ 新增專案]。 [ 新增專案 ] 對話框隨即出現。
在 [ 項目類型 ] 對話框中,選取 [Visual C# 專案]。 在 [ 範本] 窗格中,選取 [Windows 應用程式]。
(選擇性)在 [ 名稱] 中,輸入新應用程式的名稱。
單擊 [ 確定 ] 以載入 Visual C# Windows 範本。
在 [ 專案] 功能表上,選取 [ 新增參考 專案]。 [新增參考] 對話方塊隨即出現。
從 .NET 索引標籤上的清單中選取下列元件,然後按兩下 [確定]。
Microsoft.SqlServer.Replication .NET 程式設計介面
Microsoft.SqlServer.ConnectionInfo
復寫代理程序連結庫
注意
使用 CTRL 鍵來選取多個檔案。
(選擇性)重複步驟 6。 按兩下 [ 瀏覽] 索引標籤,流覽至 C:\Program Files\Microsoft SQL Server\nnn\COM,選取 [Microsoft.SqlServer.Replication.BusinessLogicSupport.dll],然後按兩下 [ 確定]。
在 [檢視] 功能表中,按一下 [程式碼]。
在程式代碼中,在命名空間語句之前,輸入下列 using 語句來限定 RMO 命名空間中的類型:
// These namespaces are required. using Microsoft.SqlServer.Replication; using Microsoft.SqlServer.Management.Common; // This namespace is only used when creating custom business // logic for merge replication. using Microsoft.SqlServer.Replication.BusinessLogicSupport;
若要建立新的 Microsoft Visual Basic .NET 專案
啟動 Visual Studio。
在 [檔案] 功能表上,選取 [新增專案]。 [新增專案] 對話方塊隨即出現。
在 [項目類型] 窗格中,選取 [Visual Basic]。 在 [範本] 窗格中,選取 [Windows 應用程式]。
(選擇性)在 [ 名稱] 方塊中,輸入新應用程式的名稱。
單擊 [ 確定 ] 以載入 Visual Basic Windows 範本。
在 [專案] 功能表上,選取 [新增參考]。 [新增參考] 對話方塊隨即出現。
從 .NET 索引標籤上的清單中選取下列元件,然後按兩下 [確定]。
Microsoft.SqlServer.Replication .NET 程式設計介面
Microsoft.SqlServer.ConnectionInfo
復寫代理程序連結庫
注意
使用 CTRL 鍵來選取多個檔案。
(選擇性)重複步驟 6。 按兩下 [ 瀏覽] 索引標籤,流覽至 C:\Program Files\Microsoft SQL Server\nnn\COM,選取 [Microsoft.SqlServer.Replication.BusinessLogicSupport.dll],然後按兩下 [ 確定]。
在 [檢視] 功能表中,按一下 [程式碼]。
在程序代碼中,在任何宣告之前,輸入下列 Imports 語句,以限定 RMO 命名空間中的類型。
' These namespaces are required. Imports Microsoft.SqlServer.Replication Imports Microsoft.SqlServer.Management.Common ' This namespace is only used when creating custom business ' logic for merge replication. Imports Microsoft.SqlServer.Replication.BusinessLogicSupport
連接到複寫伺服器
RMO 程式設計物件需要使用 類別的實例來建立 SQL Server 實例的連接 ServerConnection 。 此與伺服器的連線是由任何 RMO 程式設計物件所獨立建立。 然後,它會在實例建立期間或指派給 物件的 t 屬性,傳遞至 P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContex
RMO 物件。 如此一來,就可以個別建立及管理 RMO 程式設計對象和連接物件實例,而且單一連接物件可以與多個 RMO 程式設計物件重複使用。 下列規則適用於復寫伺服器的連線:
連接的所有屬性都會針對指定的 ServerConnection 物件定義。
每個 SQL Server 實例的連接都必須有自己的 ServerConnection 物件。
物件 ServerConnection 會指派給
P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContext
伺服器上建立或存取之 RMO 程式設計物件的 屬性。方法會 Connect 開啟與伺服器的連線。 呼叫任何方法之前,必須先呼叫此方法,才能使用連接存取任何 RMO 程式設計物件上的伺服器。
因為 RMO 和 SQL Server 管理物件 (SMO) 都使用 ServerConnection 類別來連線到 SQL Server,因此 RMO 和 SMO 物件可以使用相同的連接。 如需詳細資訊,請參閱 連線到 SQL Server 實例。
在物件中 ServerConnection 會提供連線並成功登入伺服器的所有驗證資訊。
Windows 驗證是預設值。 若要使用 SQL Server 驗證,LoginSecure必須設定為 false,而且LoginPassword必須設定為有效的 SQL Server 登入和密碼。 安全性認證必須一律安全地儲存和處理,並盡可能在運行時間提供。
對於多線程應用程式,應該在每個線程中使用個別 ServerConnection 物件。
Disconnect呼叫 物件上的 ServerConnection 方法,以關閉 RMO 物件所使用的使用中伺服器連接。
設定 RMO 屬性
RMO 程式設計物件的屬性代表伺服器上這些複寫物件的屬性。 在伺服器上建立新的複寫物件時,會使用 RMO 屬性來定義這些物件。 對於現有的物件,RMO 屬性代表現有的物件屬性,它只能針對可寫入或可設定的屬性進行修改。 屬性可以在新的物件或現有物件上設定。
設定新復寫物件的屬性
在伺服器上建立新的復寫物件時,您必須先指定所有必要的屬性,才能呼叫 物件的 Create 方法。 如需設定新復寫物件之屬性的詳細資訊,請參閱 設定發行和散發。
設定現有復寫物件的屬性
針對存在於伺服器上的復寫對象,視物件而定,RMO 可能支援變更部分或所有屬性的能力。 只能變更可寫入或可設定的屬性。 必須先呼叫 Load 或 M:Microsoft.SqlServer.Replication.ReplicationObject.LoadProperties
方法,才能變更屬性,才能從伺服器取得目前的屬性。 呼叫這些方法表示正在修改現有的物件。
根據預設,當變更物件屬性時,RMO 會根據所使用的 執行模式 ServerConnection ,將這些變更認可到伺服器。 P:Microsoft.SqlServer.Replication.ReplicationObject.IsExistingObject
方法可用來在嘗試擷取或變更其屬性之前,先確認伺服器上存在物件。 如需變更復寫物件屬性的詳細資訊,請參閱 檢視和修改散發者和發行者屬性。
注意
當伺服器的多個 RMO 用戶端或多個 RMO 程式設計物件的實例存取相同的復寫物件時, 可以呼叫 RMO 物件的 Refresh 方法,根據伺服器上的物件目前狀態來更新屬性。
快取屬性變更
SqlExecutionModes當 屬性設定為 CaptureSql RMO 所產生的所有 Transact-SQL 語句時,可以使用其中一個執行方法,在單一批次中手動執行它們。 RMO 可讓您快 M:Microsoft.SqlServer.Replication.ReplicationObject.CommitPropertyChanges
取屬性變更,並使用 物件的 方法,在單一批次中認可它們。 若要快取屬性變更, P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges
對象的 屬性必須設定為 true。 當 RMO 中的快取屬性變更時, ServerConnection 物件仍會控制何時將變更傳送至伺服器。 如需快取復寫物件之屬性變更的詳細資訊,請參閱 檢視和修改散發者和發行者屬性。
重要
雖然 類別 ServerConnection 支援在設定屬性時宣告明確交易,但這類交易可能會干擾內部復寫交易、可能會產生非預期的結果,而且不應該與 RMO 搭配使用。
啟用 RMO 元件的 TLS 1.2 支援
您可以在 Windows 2012 和更低版本上安裝更新 KB 3140245,以及建立如本文中所述的登錄機碼,來啟用對 RMO 元件的 TLS1.2 支援。 在 Windows 2012 R2 和更新版本上,只需要建立上述文章中所述的登錄機碼。
範例
此範例示範屬性變更的快取。 交易式發行集屬性所做的變更會快取,直到明確傳送至伺服器為止。
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
TransPublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Set the required properties for the publication.
publication = new TransPublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Explicitly enable caching of property changes on this object.
publication.CachePropertyChanges = true;
// If we can't get the properties for this publication,
// throw an application exception.
if (publication.LoadProperties())
{
// Enable support for push subscriptions and disable support
// for pull subscriptions.
if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
{
publication.Attributes ^= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPush;
}
// Send changes to the server.
publication.CommitPropertyChanges();
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication. " +
"Ensure that the publication {0} exists on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(
"The publication property could not be changed.", ex);
}
finally
{
conn.Disconnect();
}