2011-04-05 72 views
2

我有一項任務是創建一個大型數據複製服務來配置我們的數據倉庫。源數據庫駐留在其他服務器上。替代刪除觸發器以跟蹤已刪除的記錄

到目前爲止,我已經能夠實現更新和插入使用SqlBulkCopy類的物品一起進入倉庫,以及TSQL語句節選。

我現在的問題是處理記錄刪除。我能想到的處理刪除的唯一方法是在表上創建一個自定義觸發器,將刪除的記錄插入到我的服務可以讀取的臨時表中,並從倉庫中刪除。

我知道有很多的數據複製工具,在那裏,但該公司希望在內部的服務定製。

note一些將配置的表超過1億條記錄。

有什麼建議嗎?

+1

任何你不能做「軟刪除」的地方,你刪除它時用'1'標記'DELETED'位列? – JNK 2011-04-05 14:07:00

+0

哦,我希望!這些源數據庫系統實際上是由第三方供應商開發的。我們總是從這些供應商處獲得更新,他們可能會在更新中清除整個模式。 – 2011-04-05 14:12:47

回答

2

我不認爲刪除觸發器會很糟糕。 1億條記錄絕對是一個好的組塊,但是你正在服務器上運行觸發器,這樣SQL可以優化執行路徑。

如果你做別的事情的客戶端,你要承擔的開銷從服務器獲取記錄,然後發出刪除命令到倉庫。

關於一個令你困擾的觸發器是什麼?

+0

這是一個非常好的問題。這些源數據庫由第三方供應商安裝。我很好奇,如果有人提出了觸發技術的替代方案。 – 2011-04-05 14:22:14

1

從我讀什麼,你要重新發明複製(http://msdn.microsoft.com/en-us/library/ms151198.aspx)。這是不是總結了一下?如果是這樣,我的建議是不會的。

+0

你很對。你可以在Oracle數據庫和SQL Server數據庫之間進行復制嗎?您能否提出一些「SQL Server Replication for Dummies」鏈接/書籍? – 2011-04-05 15:07:22

+0

你可以在Oracle和SQL服務器之間進行復制(儘管我個人沒有任何經驗)。如果我剛開始,我會從我提供的鏈接開始(它轉到SQL Books Online)並查看要查看的內容。我唯一的建議是開始簡單,因爲沿途有一些令人討厭的曲折。 – 2011-04-06 02:09:12

0

我可能不完全明白你在做什麼,但在SQL Server中,你可以捕捉與該output clause刪除的行。也許這是你可以使用的東西。

-- Table to delete from 
declare @T table (id int, name varchar(50)) 

-- Table to capture the deleted rows 
declare @DeletedRows table (id int, name varchar(50)) 

-- Dummy data 
insert into @T values 
(1, 'Name1'), 
(2, 'Name2'), 
(3, 'Name3'), 
(4, 'Name4'), 
(5, 'Name5') 

-- Delete every other row 
delete from @T 
output deleted.id, deleted.name into @DeletedRows 
where id % 2 = 0 

select * 
from @DeletedRows 

結果 - 刪除的行

id   name 
----------- -------------------------------------------------- 
2   Name2 
4   Name4 
+0

多數民衆贊成在整齊。從來沒有這樣做過。不幸的是,這種情況是我想避免對源數據庫進行任何更改,因爲它們是由第三方供應商開發的。感謝您的文章! – 2011-04-05 17:06:28

+0

@ N8 - 好的。所以你不是控制刪除的人。您想要在您的供應商代碼發生時刪除這些刪除並跟蹤它們嗎? – 2011-04-05 17:15:06

+0

有點,我們有一些自定義的代碼來提供數據倉庫。我們直接訪問我們的第三方應用程序數據庫,然後使用一些額外的邏輯爲來自第三方系統的工件提供倉庫密鑰,該密鑰可用於加入數據倉庫中的其他系統數據。 – 2011-04-05 17:49:50

1

SQL Server有內置的更改跟蹤(至少在2008 R2,我不知道什麼時候被介紹此功能)。在這裏閱讀更多:http://msdn.microsoft.com/en-us/library/cc280462.aspx

+0

太棒了!我會看一看! – 2011-04-05 17:04:35

+0

,這真的很整齊。不幸的是,它看起來像只適用於Sql Server 2008,並且我有oracle&SQL服務器2005服務器,我也需要工作。儘管感謝有趣的信息! – 2011-04-06 16:36:47

0

我不得不使用觸發器插入記錄ID添加到臨時表中的好經驗。然後,我們創建了一組SSIS包和SQL代理作業輪詢登臺表並根據登臺表的內容採取適當的操作。這使得實現自定義成爲可能。由於我們在OLTP系統和倉庫之間移動數據,因此很有意義 - 記錄不總是排成行。