從 Oracle 資料庫發行的目的在於,使其運行方式幾乎與從 Microsoft SQL Server 資料庫發行相同。 不過,您應該注意下列限制和問題:
[Oracle 閘道] 選項可改善 Oracle Complete 選項的效能;不過,這個選項無法用來在多個交易式發行集中發行相同的數據表。 數據表最多可以出現在一個交易式發行集和任意數目的快照式發行集中。 如果您需要在多個交易式發行集中發佈相同的數據表,請選擇 [Oracle 完成] 選項。
復寫支持發行數據表、索引和具體化檢視。 不會複製其他對象。
Oracle 和 SQL Server 資料庫中數據的儲存和處理有一些影響復寫的細微差異。
使用 Oracle 發行者時,事務複製功能支援的方式有許多差異。
支援從 Oracle 發佈物件
複寫支援從 Oracle 資料庫複寫下列物件:
資料表
索引組織數據表
索引
具體化檢視(它們會複製為資料表)
以下項目可以出現在已發佈的表格上,但不會複製:
網域型索引
函式型索引
違約
檢查約束條件
外鍵
儲存選項(表空間、叢集等)
無法複製下列物件:
巢狀表格
瀏覽次數
封裝、封裝主體、程式和觸發程式
排隊
序列
同義詞
如需支持數據類型的詳細資訊,請參閱 Oracle 發行者的數據類型對應。
Oracle 與 SQL Server 之間的差異
Oracle 對於某些物件有不同的大小上限限制。 在 Oracle 發行集資料庫中建立的任何物件都應該遵守 SQL Server 中對應物件的大小上限。 如需 SQL Server 中限制的資訊,請參閱 SQL Server 的最大容量規格。
根據預設,Oracle 物件名稱會以大寫建立。 在透過 SQL Server 發行者發佈它們時,請務必提供 Oracle 物件名稱為大寫,若它們在 Oracle 資料庫中已為大寫。 若未在正確的案例中指定物件,可能會導致錯誤訊息,指出找不到物件。
Oracle 與 SQL Server 有稍微不同的 SQL 方言;數據列篩選應該以 Oracle 相容的語法撰寫。
大型物件的考慮
大型物件 (LOB) 資料不會儲存在發行項記錄資料表中;LOB 數據的更新一律會直接從已發佈的數據表擷取。 只有在影響 LOB 的作業引發復寫觸發程式時,才會在交易式發行集中復寫更新。 插入或刪除包含 LOB 的數據列時,會引發 Oracle 觸發程式;不過,LOB 資料行的更新不會引發觸發程式。 只有在相同 Oracle 交易中也會更新相同數據列的非 LOB 資料行時,才會立即復寫 LOB 資料行的更新。 如果沒有,當相同數據列中非 LOB 數據行的下一次更新發生時,LOB 數據行將會在訂閱者端重新整理。 請確定您的應用程式可以接受此行為。
若要復寫交易式發行集中 LOB 數據行的更新,請在撰寫應用程式時考慮下列其中一種策略:
刪除並重新插入交易中的數據列,而不是更新數據列:在重新插入數據列時指定新的 LOB。 因為刪除和插入都會觸發觸發器,因此該行將會被複寫。
除了 LOB 資料行之外,在數據列更新中包含非 LOB 資料行,或更新數據列的非 LOB 資料行做為相同 Oracle 交易的一部分。 在這兩種情況下,非 LOB 資料欄的更新可確保觸發程式會啟動。
如需 LOB 的詳細資訊,請參閱 Oracle 發行者的數據類型對應。
唯一索引和條件約束
快照和事務複製的唯一索引和約束(包括主鍵約束)中包含的欄位必須遵守某些限制。 如果它們不符合這些限制,就不會複製條件約束或索引。
SQL Server 索引中允許的數據行數目上限為 16。
包含在唯一條件約束中的所有數據行都必須具有支持的數據類型。 如需數據類型的詳細資訊,請參閱 Oracle 發行者的數據類型對應。
必須公開包含在唯一性約束中的所有欄位(不可篩選)。
涉及唯一約束或索引的資料欄不應為空值。
也請考慮下列問題:
Oracle 和 SQL Server 會以不同的方式處理 NULL:Oracle 允許針對允許 NULL 且包含在唯一條件約束或索引的數據行中具有 NULL 值的多個數據列。 SQL Server 只允許具有相同數據行 NULL 值的單一數據列,藉此強制執行唯一性。 如果發行的數據表包含多個數據列,且索引或條件約束中包含的任何數據行都含有 NULL 值,則您無法發佈允許 NULL 的唯一條件約束或索引,因為訂閱者上會發生條件約束違規。
測試唯一性時,SQL Server 會忽略欄位中尾端空白,但不會由 Oracle 忽略。
如同 SQL Server 事務性複製,Oracle 交易性發佈中的表格需要主鍵;主鍵必須根據上述指定的規則是唯一的。 如果主鍵不遵循先前項目符號中所述的規則,則無法發布表以進行交易複製。
Oracle 發行與標準事務複製之間的差異
Oracle 發佈者的名稱不能與以下任何名稱相同:其 SQL Server 散佈者,任何使用該散佈者的 SQL Server 發佈者,以及任何接收發行集的訂閱者。 由相同散發者發行的出版物必須各有唯一的名稱。
在 Oracle 發行物中發表的資料表無法接收複製的資料。 因此,Oracle 發布不支援:具有立即更新或佇列更新訂閱的發布;或在拓撲中,發布的數據表同時作為訂閱數據表使用,例如點對點和雙向複寫。
在 Oracle 資料庫中,主鍵和外鍵的關聯性不會被複製到訂閱者。 不過,在傳遞變更時,數據中會維護關聯性。
標準的交易文件支援最多1000列的數據表。 Oracle 交易式發行集支援 995 個數據行(複寫會將五個數據行新增至每個已發佈數據表)。
Collate 子句會被新增至 CREATE TABLE 語句,以啟用區分大小寫的比較,這對於主鍵和唯一約束很重要。 此行為是由架構選項0x1000所控制,這個行為是以 sp_addarticle (Transact-SQL) 的 @schema_option 參數指定。
如果您使用預存程式來設定或維護 Oracle 發行者,請勿將程式放在明確交易內。 這個操作不支援用於連接到 Oracle 發行者的鏈接伺服器。
如果您使用精靈建立 Oracle 發行集的提取訂閱,則必須使用 SQL Server 2005 和更新版本所提供的新增訂閱精靈。 不過,對於舊版的 SQL Server,您可以使用預存程式和 SQL-DMO 介面來設定 Oracle 發行集的提取訂閱。
如果您使用儲存程序將變更傳播至訂閱端(預設方式),請注意儘管支援MCALL語法,但當出版集來自Oracle出版者時,它的行為會有所不同。 MCALL 通常會提供一個位圖,以顯示發行者端哪些資料欄位已被更新。 使用 Oracle 發行集時,點陣圖一律會顯示所有數據行都已更新。 如需使用預存程式的詳細資訊,請參閱 指定如何傳播交易式發行項的變更。
事務複製功能支援
Oracle 發行集不支援 SQL Server 發行集支援的所有架構選項。 如需架構選項的詳細資訊,請參閱 sp_addarticle (Transact-SQL) 。
Oracle 發行集的訂閱者不能使用立即更新訂閱或佇列更新訂閱,或作為點對點或雙向拓樸中的節點。
Oracle 發行集的訂閱者無法從備份自動初始化。
SQL Server 支援兩種類型的驗證:binary 和 rowcount。 Oracle 發行者支持數據列計數驗證。 如需詳細資訊,請參閱驗證複製的資料。
SQL Server 提供兩種快照集格式:原生 bcp 模式和字元模式。 Oracle 發行者支援字元模式快照集。
不支援已發行 Oracle 資料表的架構變更。 若要進行架構變更,請先卸除發行集、進行變更,然後重新建立發行集和任何訂閱。
備註
如果架構發生變更,並且後續發行和訂閱操作的卸除及重新建立是在發行表格上沒有任何活動的時間進行,您可以為訂閱指定「僅支援復寫」選項。 這可讓它們同步,而不需要將快照集複製到每個訂閱者。 如需詳細資訊,請參閱 初始化不使用快照集的交易式訂閱。
復寫安全性模型
Oracle 發行的安全性模型與標準事務複製的安全性模型相同,但有下列例外:
快照集代理程式和記錄讀取器代理程式從散發者連線到發行者的帳戶,是透過下列其中一種方法來指定:
sp_adddistpublisher (Transact-SQL) 的@security_mode參數(如果使用 Oracle 驗證,您也會指定@login和@password的值)
在 SQL Server Management Studio 的 連接到伺服器 對話框中,當您在 SQL Server 發行點設定 Oracle 發行端時,會用到此對話框。
在標準事務複製中,帳戶是以 sp_addpublication_snapshot (Transact-SQL) 和 sp_addlogreader_agent (Transact-SQL) 指定。
快照代理程式和日誌讀取器代理程式所使用的帳戶無法透過 sp_changedistpublisher(Transact-SQL) 或屬性設定進行變更,但密碼可以更改。
如果您為 sp_adddistpublisher (Transact-SQL) 的 @security_mode 參數指定 1 值 (Windows 整合式驗證):
用於快照代理程式和記錄讀取代理程式的帳戶和密碼(@job_login 和 @job_password 參數,應為 sp_addpublication_snapshot (Transact-SQL) 和 sp_addlogreader_agent (Transact-SQL)的參數),必須與用來連線到 Oracle 發行者的帳戶和密碼相同。
您無法透過 sp_changepublication_snapshot (Transact-SQL) 或 sp_changelogreader_agent (Transact-SQL) 來變更 @job_login 參數,但密碼可以變更。
如需復寫安全性的詳細資訊,請參閱 SQL Server 複寫安全性。
另請參閱
Oracle 發行者的行政考慮事項
設定 Oracle 發行者
Oracle 發行概觀