SQL Remote 被設計為允許在多個不同站點更新數據庫。需要小心設計以避免復制錯誤,特別是如果數據庫具有復雜結構時。本文描述在復制設置中可能發生的錯誤和沖突類型;後面幾節描述可如何設計發布,從而避免錯誤和管理沖突。
注釋:在此不討論傳送錯誤本文中不討論和消息傳送失敗相關的問題。
復制錯誤
復制錯誤分為以下幾類:
·重復主鍵錯誤
兩個用戶使用相同的主鍵值插入行,或者一個用戶更新了主鍵,第二個用戶插入具有該新值的主鍵。復制系統中到達給定數據庫的第二個操作失敗,因為它將產生重復的主鍵。
·未找到行錯誤
一個用戶刪除了行 (即具有給定主鍵值的行)。
第二個用戶在另一站點更新或刪除同一行。
在這種情況下,第二個語句失敗,因為找不到該行。
·參照完整性錯誤
如果發布中包括包含外鍵的列,但不包括相關的主鍵,則抽取實用程序在遠程數據庫不使用外鍵定義,這樣在遠程數據庫的 INSERT 就不會失敗。
這一點可以通過在表定義中包括適當的缺省值來解決。
當主表具有 SUBSCRIBE BY 表達式,而相關外表沒有時,也可發生參照完整性錯誤;此時可能復制外表中的行,但主表中的行可能從發布中被排除。
復制沖突
復制沖突和錯誤不同。如果正確處理,沖突在 SQL Remote 中不是問題。
沖突:假設一個用戶更新了行,第二個用戶在另一站點更新同一行,則第二個用戶的操作成功,且 SQL Remote 允許通過觸發觸發器 (Adaptive Server Anywhere) 或調用過程 (Adaptive Server
Enterprise),從而以使要更改數據有意義的方式來解決這些沖突。
沖突將在許多安裝中發生。 SQL Remote 允許將使用觸發器和過程的適當沖突解決方法作為 SQL Remote 安裝的常規操作的一部分。
必須通過設計在設置中排除復制中的 SQL 錯誤。 SQL Remote 包括一個幫助跟蹤 SQL 語句中的錯誤的選項,但該選項並不是用來解決這些錯誤的。
通過設置 Replication_error 選項,可在指定發生 SQL 錯誤時消息代理調用的存儲過程。缺省情況下,不調用任何存儲過程。
在 Adaptive Server Anywhere 中設置 Replication_error 選項:
•發出以下語句:
SET OPTION remote-user.Replication_error = 'procedure-name'
其中 remote-user 是消息代理命令行中的用戶 ID, procedure-name 是檢測到 SQL 錯誤時調用的過程。
◆在 Adaptive Server Enterprise 中設置 Replication_error 選項:
•發出以下語句:
exec sp_remote_option Replication_error, procedure- name go
其中 procedure-name 是檢測到 SQL 錯誤時調用的過程。
復制錯誤過程的要求 復制錯誤過程必須有類型為 CHAR、 VARCHAR 或 LONG VARCHAR的一個參數。該過程用 SQL 錯誤消息調用一次,用引起錯誤的 SQL 語句調用一次。