當您嘗試在 SQL Server 2005 中插入的合併式複寫訂閱者上的資料時,FIX: 錯誤訊息: 「 訊息 548、 層級 16 狀態 2,線條 1。插入失敗 」

文章翻譯 文章翻譯
文章編號: 953481 - 檢視此文章適用的產品。
Bug #: 50002854 (SQL Hotfix)
Microsoft 為一個可下載檔案散佈 Microsoft SQL Server 2005 的修正程式。因為修正程式是累積,每個新版本包含所有 Hotfix 及先前的 SQL Server 2005 隨附所有安全性修正程式都修正發行。
全部展開 | 全部摺疊

在此頁中

徵狀

考慮下列案例。在 SQL Server 2005 中設定合併式發行集。您新增包含合併式發行集的識別資料行的表格。然後,您將資料插入資料表的發行者。您同步處理訂閱者和發行者之間的資料,然後在您嘗試插入發行者上的其他資料。在這種情況下收到下列錯誤訊息發行者上:
訊息 548,層級 16,2,狀態行 1
插入失敗。識別身分與它衝突範圍檢查資料庫中的條件約束 'DatabaseName ',複寫的資料表 ' SchemaTableName ',' ColumnName' 的資料行。如果識別資料行自動由複寫所管理,更新範圍,如下所示: 「 發行者 」 執行 sp_adjustpublisheridentityrange ; 若要取得 「 訂閱者 」 執行 「 散發代理程式 」 或 「 合併代理程式 」。
如果您嘗試若要執行 sp_adjustpublisheridentityrange 預存程序發行者上正如錯誤訊息中所提到的您仍然無法解決這個問題。

當多個合併代理程式一次相同的合併發行集的同步處理資料時,就會發生這個問題。如果您有許多合併式發行集的訂閱者,可以 exacerbated 這個問題。

發生的原因

目前識別值發行者上資料表的不識別範圍檢查條件約束的識別範圍內,就會發生這個問題。當多重的合併代理程式嘗試增加在同一時間的識別範圍,藉由建立發行者上的下一個識別範圍時,就會發生這個問題。

解決方案

這個問題的修正程式先於累計更新 8 發行。如需有關如何取得此累積更新套件的 SQL Server 2005 Service Pack 2 的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
951217SQL Server 2005 Service Pack 2 的累積更新套件 8
附註因為組建是累計,每個新的修正程式版本包含所有 Hotfix 及先前的 SQL Server 2005 隨附所有安全性修正程式都修正發行。Microsoft 建議您考慮安裝最新的修正程式發行版本包含此 Hotfix。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
937137SQL Server 2005 會建置 SQL Server 2005 Service Pack 2 已發行之後所發行
Microsoft SQL Server 2005 的 Hotfix 會建立特定的 SQL Server Service Pack。您必須將 SQL Server 2005 Service Pack 2 Hotfix 套用至的 SQL Server 2005 Service Pack 2 安裝。預設狀況下,在 SQL Server Service Pack 中提供任何 Hotfix 包含在下一個 SQL Server Service Pack。

其他可行方案

如果要解決這個問題,您必須防止多個並行合併同步處理。若要執行此動作將 max_concurrent_merge 屬性設定合併式發行集上藉由執行下列陳述式:
sp_changemergepublication '<PublicationName>', 'max_concurrent_merge', 1
附註 當您使用這項因應措施,如果您有許多為發行集的訂閱者,可能會降低效能。只有一個訂閱者可以同步資料一次,就會發生這個問題。

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。

其他相關資訊

如何判斷是否會發生此問題

如果要判斷是否會發生此問題,請依照下列步驟執行:
  1. 請確認目前識別值小於第一個識別範圍的識別範圍檢查條件約束的下限。

    若要取得目前識別值,執行下列陳述式:
    SELECT IDENT_CURRENT ('<TableName>')
    若要取得的識別範圍檢查條件約束的識別範圍,執行下列陳述式之一:
    陳述式 1
    sp_helpconstraint '<TableName>'
    陳述式 2
    select * from MSmerge_identity_range
    where is_pub_range <>1
    AND artid IN 
     (select artid from sysmergearticles where name='<TableName>')
    AND subid in 
     (select subid from sysmergesubscriptions  MS
    join sysmergepublications MP 
    on MS.subscriber_server=MP.publisher
    AND MS.db_name = MP.publisher_db
    WHERE name='<PublicationName>'
    )
    
  2. 用於判斷是否由為同一個發行集的個別合併代理程式工作階段啟動交錯的執行 sp_MSsetup_publisher_idrange 預存程序的 SQL Server Profiler 追蹤。

    不過,交錯的 sp_MSsetup_publisher_idrange 預存程序的執行數目不一定表示發生此問題。這是因為沒有執行 SQL Server 分析工具,當原始所有合併同步處理的產生第一個錯誤訊息。 然而,交錯的執行 sp_MSsetup_publisher_idrange 預存程序的增加遇到此問題的可能性。
  3. 您可以找到重疊時,會發生您收到,就會發生 548 」 錯誤訊息的合併同步處理。若要執行此動作,您可以檢閱合併歷程記錄,在散發資料庫中。 若要執行此動作執行下列陳述式:
    Use distribution
    GO
    select session_id, agent_id, B.publication, min(time) as StartTime, max(time) as EndTime
    into #sessiontimes
    from dbo.MSmerge_history A
    join dbo.msmerge_agents B
    on A.agent_id = B.id
    group by session_id, agent_id, publication
    order by 3 desc
    GO
    -- The left side result is the original session. The right side result is the overlapping session.
    select A.*, B.* 
    from #sessiontimes A
    Join #sessiontimes B
    On B.StartTime >= A.StartTime
    AND B.StartTime <= A.EndTime
    AND A.session_id <> B.session_id
    And A.publication=B.publication
    Order By A.StartTime asc
    GO
    drop table #sessiontimes
    

如何修正現有的損毀可能會發生問題的資料表的識別範圍

在您安裝累積更新後或之後的因應措施區段以使用方法所述,無法校正資料表中現有的損毀的識別範圍。如果您嘗試將資料插入資料表,並同步處理訂閱者上的資料,您仍然會收到 548 」 的錯誤訊息。因此,您必須手動更正為資料表損毀的識別範圍。要這麼做,請您執行下列步驟。

附註這些步驟都牽涉到以手動方式覆寫資料表正確 reseed 識別值,在發行者端的目前識別種子值。在損毀狀態目前識別值小於第一個的識別範圍,在合併複寫的識別範圍檢查條件約束。這些步驟以手動方式引發識別值落在合併複寫的識別範圍檢查條件約束所定義的識別範圍內。這些步驟假設身分遞增的方式中設定,以及設定識別值增量為 1 的值增加。
  1. 確認識別值增量值為 1 且身分會繼續以遞增的方式。您可以在發行者上執行下列陳述式來取得識別遞增值:
    SELECT IDENT_INCR( '<TableName>')
  2. 若要尋找在有問題的識別資料行上的目前識別值發行者上執行下列陳述式:
    DBCC CHECKIDENT ('<TableName>')
    收到結果後記下 [目前識別值 值進行比較,在稍後步驟中。請注意 目前的資料行值 valye 可能大於或小於 目前識別值 的值。

    如果 目前的資料行值 的值大於 目前識別值 值,資料行的值可能會有源自其他複寫拓樸中,而且與發行者複寫成功合併。如果 目前的資料行值 的值小於 目前識別值 值,值可能是插入發行者上在較早的時間使用 SET IDENTITY_INSERT ON 陳述式之前合併複寫組態。
  3. 在發行者,以判斷目前的識別範圍的識別範圍檢查有問題的資料表的條件約束上執行下列陳述式:
    Use <PublishedDatabaseName>
    GO
    sp_helpconstraint '<TableName>'
    GO
    
    收到結果後記下其中 constraint_name 資料行的值是 repl_identity_range_ GUID 資料錄的 constraint_keys 資料行的值。GUID 值對應至 artid 欄 sysmergearticles 系統資料表中的發行項的值。若要取得 GUID,執行下列陳述式: 從 sysmergearticles
    select artid from sysmergearticles where name = '<TableName>'
    識別範圍檢查條件約束跨越兩個不同的範圍。範圍兩組不必是連續的。比方說 constraint_keys 資料行的值可以是,如下所示:
    ([ColumnName] > (1001) 和 [ColumnName]<=(2001)
    OR [ColumnName] > (9001) 和 [ColumnName]<=(10001))
    附註本文使用本範例在其餘的步驟中呈現程式碼。

    在此範例範圍每個會跨越 1,000 的值。1,000 是預設範圍大小。 但是,您可以使用下列方法之一來變更識別範圍大小:
    • 指定 @ pub_identity_range 參數,當您執行 sp_addmergearticle 預存程序。
    • 變更發行項 發行項屬性] 對話方塊中的 [訂閱者範圍大小] 屬性。
  4. 如果您遇到 < 徵狀 > 一節所述的問題時,您在步驟 2 中記下的目前識別值應該小於您在步驟 3 中記下識別範圍檢查條件約束的第一個的識別範圍的下限。

    如果在步驟 2 中目前的識別值大於第二個身分識別範圍的上限的識別範圍檢查條件約束,使用建議您在錯誤訊息中的方法來解決問題。因此,您應該在發行者上執行 sp_adjustpublisheridentityrange 預存程序。

    如需有關 sp_adjustpublisheridentityrange 預存程序的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
    http://msdn.microsoft.com/en-us/library/ms181527.aspx
  5. 執行下列陳述式,以判定任何資料列是否在目前的識別範圍的識別範圍檢查條件約束:
    SELECT COUNT(*) FROM TableName WHERE 
    ([ColumnName]>(1001) AND [ColumnName]<=(2001) 
    OR [ColumnName]>(9001) AND [ColumnName]<=(10001))
    
    備忘稿
    • 如果陳述式會傳回 0,沒有資料列是位於目前的識別範圍。在這種情況下請跳至步驟 6。
    • 如果陳述式傳回值大於 0 的值,執行下列陳述式,以取得最大識別值中目前的 「 識別 」 範圍:
      SELECT MAX(ColumnName) as MaxValue FROM TableName WHERE 
      ([ColumnName]>(1001) AND [ColumnName]<=(2001) OR 
      [ColumnName]>(9001) AND [ColumnName]<=(10001))
      
      記下 「 傳回的值,然後再移至步驟 7。
  6. 手動 reseed 落在有效範圍內有問題的資料表目前的識別身分。

    reseed 目前的識別身分,目前的 「 識別 」 範圍加上 1 的最低值。 比方說如果目前的識別範圍的最低的值是 1001年,第一個可能在範圍值是 1002年因為低的識別範圍檢查條件約束範圍的結尾使用較大符號 (>)。若要執行這項操作、 在發行者上執行下列陳述式,然後跳到步驟 8:
    DBCC CHECKIDENT ('TableName', RESEED, 1002)
  7. 手動 reseed 落在有效範圍內有問題的資料表目前的識別身分。

    假設識別值增量為 1。reseed 目前的識別身分為您在步驟 5 中, 記下的值,然後再新增 [1]。比方說如果您在步驟 5 中所記下的值是 1507年,reseed 1508 到目前的識別身分。若要執行此動作發行者上執行下列陳述式:
    DBCC CHECKIDENT ('TableName', RESEED, 1508)
  8. 執行測試,以判定是否新的資料列可插入發行者資料庫中資料表不含錯誤 548 發生。
如需有關哪些檔案會變更,及資訊有關任何先決條件套用累積更新套件,包含此 「 Microsoft 知識庫 」 文件中所述的 Hotfix,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
951217SQL Server 2005 Service Pack 2 的累積更新套件 8

?考

如更多有關清單的組建,都可以使用 SQL Server Service Pack 2 之後,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
937137SQL Server 2005 會建置 SQL Server 2005 Service Pack 2 已發行之後所發行
如更多有關累加式的維修模型為 SQL Server,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
935897累加式的維修模型是可以從 SQL Server 小組來傳遞回報問題的 Hotfix
如需有關如何取得 SQL Server 2005 Service Pack 2 的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
913089如何取得最新的 Service Pack,SQL Server 2005 的
如需有關新功能與 SQL Server 2005 Service Pack 2 的改進的詳細資訊,請造訪下列 Microsoft 網站:
http://go.microsoft.com/fwlink/?LinkId=71711
為 SQL Server 命名結構描述的相關資訊更新,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
822499Microsoft SQL Server 軟體更新套件的新命名結構描述
如需有關軟體更新術語的詳細資訊,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明

屬性

文章編號: 953481 - 上次校閱: 2008年7月11日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard X64 Edition
  • Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Enterprise X64 Edition
  • Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems
  • Microsoft SQL Server 2005 Workgroup Edition
關鍵字:?
kbmt kbhotfixrollup kbfix kbpubtypekc kbqfe kbexpertiseadvanced kbhotfixserver kbautohotfix kbsql2005repl KB953481 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:953481
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com