2009-01-07 110 views
2

假設我有帶有TableA的DatabaseA,它包含以下字段:Id,Name。SQL Server複製可以在複製數據中包含源數據庫?

在另一個數據庫,DatabaseB,我有表A具有以下字段:DatabaseId,編號,名稱。

是否有可能建立一個複製發佈,將發送:

DatabaseA.dbid,DatabaseA.TableA.Id,DatabaseA.TableA.Name

到DatabaseB.TableA?

編輯: 我問的原因是我需要將多個數據庫(具有相同的模式)組合成一個數據庫,儘可能延遲。複製似乎是一個很好的開始(需要將數據從一個地方複製到另一個地方),但我只是在頭腦風暴階段。我一定會接受有關如何在不使用複製的情況下完成此任務的建議。

+0

你只是在「複製」新的和/或已更改的記錄,還是在複製源中的刪除?也許像SSIS和MERGE JOIN動作可能更像你要找的東西:http://www.mssqltips.com/tip.asp?tip=1322 – SqlRyan 2009-01-07 20:47:40

回答

2

可能有一種更簡單的方法來做到這一點,但我首先想到的是將TableA封裝在源數據庫的索引視圖中,然後將該視圖作爲表複製(即type =「indexed view logbased」 )。不過,我認爲這不適用於合併複製。

所以,這將大致是這樣:

CREATE VIEW TableA_with_dbid WITH SCHEMABINDING AS 
SELECT DatabaseA.dbid, Id, Name FROM TableA 

CREATE UNIQUE CLUSTERED INDEX ON TableA_with_dbid (Id) -- or whatever your PK is 

EXEC sp_addarticle ..., 
    @source_object = 'TableA_with_dbid', 
    @destination_table = 'TableA', 
    @type = 'indexed view logbased', 
    ... 

重要的提醒:索引視圖有a lot of requirements,可能不適合你的應用程序。例如,每次更新基表時都必須設置某些選項。

(響應編輯您的問題...)這將不是多個源組合成一個工作表中。AFAIK,訂閱數據庫中的對象只能來自一篇發表的文章。由於UNION在索引視圖中不允許,因此您無法在訂閱端執行索引視圖。 (文檔沒有明確指出UNION ALL是不允許的,但它不會讓我感到意外,您可以試試以防萬一)但它仍然會回答您的明確問題:dbid將位於複製表中。

+0

謝謝Tadmas,使用Views也跨越了我的想法。另外,正如我評論rwmnau的答案 - 我更新了我的問題以包含更多細節。我需要將多個數據庫合併爲一個,並且(顯然)組合表中的每個記錄都必須是唯一的。 – MrDustpan 2009-01-07 19:54:06

2

您是否將這些事件從多個來源彙總到一個地方?複製只來自一個來源 - 它是一對一的,所以源ID似乎不太合理。

如果你聚合來自多個來源的數據,也許鏈接的服務器,並觸發是一個更好的選擇,如果是這樣的話,那麼你可以完全包含有關所需的源的任何信息。

如果你能澄清你的問題來描述目的,它會幫助我們找到最佳的解決方案。

修訂FROM新的細節題:

這是否解決方案聽起來像它可能是你需要什麼?

  1. 在源數據庫上設置AFTER觸發器,該源數據庫將任何已更改的行發送到中央存儲庫數據庫的某種保存表中。這些行可以包含其他列,如「源」,「更改類型」(用於插入,刪除等)。
  2. 一些中央工藝手錶表和處理新的行(或週期性地運行 - 次/分鐘,也許),將他們納入中央數據庫

你可以調整的頻率檢查/合併過程的運行服務器根據你的需要(甚至不斷運行它來處理出現的新行,也許甚至在該表上也有一個AFTER觸發器)。

+0

謝謝rwmnau,你完全正確 - 我需要彙總多個來源。我已經更新了一些更詳細的信息。 – MrDustpan 2009-01-07 19:45:35