Replication Management Objects Concepts
複寫管理物件 (RMO) 是一個 Managed 程式碼元件,可封裝SQL Server的複寫功能。 RMO 是由 Microsoft.SqlServer.Replication 命名空間實作。
下列章節中的主題將說明如何使用 RMO 屬性,以程式設計方式控制複寫工作。
設定散發
本節中的主題示範如何使用 RMO 來設定發行與散發。
建立發行集
本章節中的主題示範如何使用 RMO 來建立、刪除和修改發行集與發行項。
訂閱發行集
本章節中的主題示範如何使用 RMO 來建立、刪除和修改訂閱。
保護複寫拓撲
本章節中的主題示範如何使用 RMO 來檢視和修改安全性設定。
同步處理訂閱 (複寫)
本章節中的主題示範如何同步處理訂閱。
監視複寫
本章節中的主題示範如何以程式設計方式監視複寫拓撲。
RMO 程式設計簡介
RMO 的設計目的是針對SQL Server複寫的所有層面進行程式設計。 RMO 命名空間是 Microsoft.SqlServer.Replication ,而且是由 microsoft .NET Framework 元件Microsoft.SqlServer.Rmo.dll實作。 同時也屬於 Microsoft.SqlServer.Replication 命名空間的 Microsoft.SqlServer.Replication.dll 組件,會實作 Managed 程式碼介面,以設計各種複寫代理程式的程式 (快照集代理程式、散發代理程式以及合併代理程式)。 可從 RMO 存取其類別以同步處理訂閱。 在由 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll 組件所實作的 Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空間中的類別,是用以為合併式複寫建立自訂商務邏輯。 這個組件與 RMO 無關。
根據 RMO 部署應用程式
RMO 取決於複寫元件和用戶端連線元件,這些元件隨附于所有版本的 SQL Server,但SQL Server Compact除外。 若要根據 RMO 部署應用程式,您必須安裝SQL Server版本,其中包含應用程式執行所在電腦上的複寫元件和用戶端連線元件。
RMO 使用者入門
本節說明如何使用 Microsoft Visual Studio 啟動簡單的 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\120\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\120\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 程式設計物件之外建立。 接著會在執行個體建立期間將它傳遞到 RMO 物件,或是將它指派到物件的 ConnectionContext 屬性。 以此方式,就可以個別建立和管理 RMO 程式設計物件與連接物件執行個體,而且多個 RMO 程式設計物件可以重複使用單一連接物件。 下列規則適用於應用程式伺服器的連接:
連接的所有屬性是針對指定的 ServerConnection 物件所定義。
每個SQL Server實例的連接必須有自己的 ServerConnection 物件。
會將 ServerConnection 物件指派到要在伺服器上建立或存取的 RMO 程式設計物件之 ConnectionContext 屬性。
Connect 方法會開啟伺服器的連接。 必須先呼叫這個方法,才能呼叫在使用此連接的任何 RMO 程式設計物件上存取伺服器之任何方法。
因為 RMO 和SQL Server管理物件 (SMO) 兩者都使用 ServerConnection 類別來連線到SQL Server,所以 RMO 和 SMO 物件可以使用相同的連接。 如需詳細資訊,請參閱連線到 SQL Server 的執行個體。
在 ServerConnection 物件中,會提供所有建立連接及成功登入伺服器的驗證資訊。
Windows 驗證是預設值。 若要使用SQL Server驗證, LoginSecure 必須設定為
false
, Login 而且 Password 必須設定為有效的SQL Server登入和密碼。 安全性認證必須以安全方式儲存和處理,而且每當有需要時必須在執行階段提供。對於多執行緒應用程式,應該在每個執行緒中使用個別的 ServerConnection 物件。
在 Disconnect 物件上呼叫 ServerConnection 方法,以關閉 RMO 物件所使用的使用中伺服器連接。
設定 RMO 屬性
RMO 程式設計物件的屬性代表在伺服器這些複寫物件的屬性。 在伺服器建立新複寫物件時,會使用 RMO 屬性來定義這些物件。 對於現有的物件,RMO 屬性代表現有物件的屬性,只能修改可寫入或是可設定的屬性。 屬性可以在新物件或是現有物件上設定。
設定新複寫物件的屬性
在伺服器建立新複寫物件時,您必須先指定所有必要的屬性,才能呼叫物件的 Create
方法。 如需為新複寫物件設定屬性的詳細資訊,請參閱設定發行和散發。
設定現有複寫物件的屬性
對於存在於伺服器上的複寫物件,視物件而定,RMO 可能支援變更某些或是所有其屬性的能力。 只可以變更可寫入的或可設定的屬性。 在變更屬性之前,必須先呼叫 Load
或 LoadProperties 方法,從伺服器取得目前的屬性。 呼叫這些方法表示要修改現有的物件。
依預設,當變更物件屬性時,RMO 會根據要使用的 ServerConnection 之執行模式,將這些變更認可到伺服器。 IsExistingObject 方法可用以在嘗試擷取或是變更其屬性之前,先驗證存在於伺服器的物件。 如需變更複寫物件屬性的詳細資訊,請參閱檢視及修改散發者和發行者屬性。
注意
當有多個 RMO 用戶端或是多個 RMO 程式設計物件的執行個體,在伺服器上存取相同複寫物件時,可以呼叫 RMO 物件的 Refresh
方法,以便根據伺服器上物件目前的狀態來更新屬性。
快取屬性變更
SqlExecutionModes當 屬性設定為 CaptureSql RMO 所產生的所有 Transact-SQL 語句時,可以使用其中一個執行方法,在單一批次中手動執行它們。 RMO 可讓您使用物件的 CommitPropertyChanges 方法,以擷取屬性變更並在單一批次中一起認可它們。 若要快取屬性變更,必須將物件的 CachePropertyChanges 屬性設定為 true
。 在快取 RMO 中的屬性變更時,ServerConnection 物件仍然會控制何時將變更傳送到伺服器。 如需快取複寫物件之屬性變更的詳細資訊,請參閱檢視及修改散發者和發行者屬性。
重要
雖然 ServerConnection 類別支援在設定屬性時宣告明確的交易,不過,這樣的交易可能會平擾內部複寫交易、可能會產生非預期的結果,而且不應該與 RMO 搭配使用。
範例
這個範例會示範屬性變更的快取。 會快取對於交易式發行集屬性所做的變更,直到將它們明確地傳送到伺服器為止。
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2012";
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();
}