2010-01-28 152 views
2

我正在使用sql server 2000.我只需要從遠程服務器獲取更新的記錄,並且需要在每天的本地服務器中插入該記錄。但該表沒有創建日期或修改日期字段。sql server只獲取更新記錄

回答

0

我通過使用tablediff實用程序解決了這個問題,該實用程序將比較兩個表中的數據用於非收斂,並且特別適用於解決複製拓撲中的非收斂問題。

查看鏈接。

tablediff utility

+0

你意識到這個工具需要從源代碼和目的地中獲取所有400萬條記錄的副本嗎? – NotMe 2010-01-28 19:17:55

+0

最初,當我通過直接字段與字段比較來同步這兩個表(具有數百萬條記錄)時,需要1個小時才能完成。 但通過使用tablediff實用程序,只需1分鐘即可完成。 – Srinivasan 2010-01-29 04:40:24

0

如果你不能改變遠程服務器的數據庫,你最好的選擇可能是想出某種給定行的值的哈希函數,比較舊的和新的表,並且只把那些函數(oldrow)!=函數(newrow)。

您也可以直接比較有問題的列,並且在新舊問題不是所有列都相同的情況下複製該記錄。

這意味着你不能修改新表中的值,否則它們將被舊的每日覆蓋。如果這是一個問題,您需要另一個表來緩存前一天的舊錶值;那麼你將能夠判斷在過渡期間是否修改了舊的,新的或兩者。

+0

我無法修改遠程服務器中的表結構。我無法在遠程服務器上創建任何觸發器。只有我能夠讀取表格記錄。 – Srinivasan 2010-01-28 07:25:42

+0

我知道這些都是約束條件,並且我已經提供了您的選項,因爲有這些限制。我承認這並不理想。儘管如此,我認爲400萬行可能可以用於每日更新。如果你可以在遠程服務器上安裝某些東西,但根本不能修改數據庫,那麼你可以通過在該機器上運行一個服務來加快速度,這將完成比較工作,並報告受影響行的ID,所以只有少數受影響的行,更新查詢才能通過線路拉取數據。 – Jay 2010-01-28 07:38:08

1

您需要在表格中這標誌新的或時尚或其他更新的記錄下面

  • 列的一個(lastupdate_timestamp,增量更新計數器...)
  • 上插入一些觸發和在桌面上更新,產生一些副作用,如將相應的行ID添加到單獨的表中

您還可以逐行比較來自遠程服務器的數據與生產服務器的數據獲取新的或更新的列表ed rows ...這樣的差異更新也可以通過比較一些散列值,每行一個,從該行的所有列的值計算得出。

除非一個以上,並且除了一些MS-SQL內置的複製設置,我能想到的唯一的可能是[不漂亮]:

  • 解析SQL日誌,以確定更新和增加到桌上。這需要專門的軟件;我甚至不確定日誌文件格式是否已發佈/記錄,儘管我已經看到了這種類型的工具。坦白地說,這種方法更適用於法醫類型的情況...
+0

我無法比較表格中的每一行。因爲記錄大小在百萬(在ROM服務器中爲4百萬行)範圍內。問題在於,可能會影響一個或兩個記錄(插入,更新或刪除)。我需要每天同步兩個表(在服務器和本地)。 – Srinivasan 2010-01-28 07:23:46

+0

我無法在該服務器上創建觸發器。因爲我只有閱讀該表的權限。 – Srinivasan 2010-01-28 07:31:28

2

使用Transactional Replication

更新

如果你不能做源管理操作,那麼你將不得不每天讀的所有數據。由於您無法檢測到更改(並且請記住,即使您有時間戳,您仍然無法檢測到更改,因爲無法檢測到具有時間戳的刪除),那麼您必須每次都讀取每行你同步。如果您閱讀每一行,那麼最簡單的解決方案就是將您擁有的所有數據替換爲新快照。

+0

+1:是的。爲什麼重新發明車輪權.. – 2010-01-28 07:08:45

+1

我認爲這必須配置,它聽起來像OP有關於遠程服務器綁手。 – Jay 2010-01-28 07:40:13

0

綜上所述:

  1. 你有,你不能修改任何一箇舊的遠程數據庫服務器(如表,觸發器等)。
  2. 您不能使用複製。
  3. 數據本身沒有指示上次修改的日期/時間。
  4. 您不想每次都拉下整個表格。

這給我們留下了不可能的情況。

如果上面的前三項是真的,那麼您只能拉動整個表格。即使他們確實有修改的日期/時間列,您也不會檢測到刪除。這讓我們回到了原點。

去和你的老闆談談,並要求更好的要求。也許這次可以做些什麼。