2011-08-10 122 views
0

我有兩個表(實際上是一組表),可能需要保持同步(第一組表我需要將所有數據複製到第二組,這裏的數據將是一個子集)。DB2在兩個表之間保持n列同步

如果事情爲什麼(也許是因爲它顯然是不具有複製的數據非常好形式)看到(這另一個問題下的「PS」部分最底部):DB2 update and insert trigger, references a lot of fields can I use * to shorten them (in iSeries but might not matter)

要做到這一點,我將插入,更新和刪除觸發器放在我稱之爲「主集」的位置上,它將插入,更新和刪除記錄到「複製集」上。

我的問題是,如果我現在想保持複製集與主集同步?我現在正在查看文檔以查看執行此操作的最佳方法。我不希望插入觸發器嘗試插入到最初插入的表中,因爲我期望這會導致一個錯誤,該錯誤會報告給插入的程序,除非在觸發器中有方法拋出這樣的報告?此時最好的方法看起來像檢查記錄是否存在於刪除之前,插入相同。

;那麼,遞歸上的更新觸發的問題,我想知道是否有更好的解決方案相比,該值是相同的,然後不更新檢查?

主集不能以任何方式被改變(除了其不以任何方式修改輸入/從表中輸出的觸發器),而複製的集模式是完全靈活的。

優化的lazyness(我可能會自動這些觸發器的創建,但如果你有關於如何保持他們的建議壓縮會加快我的發展)。

系統未大量使用,它的免費資源音...有一點需要保守與存儲,處理和磁盤空間。

回答

1

而不是使用複製表,你會更好地使用視圖。這將允許您完全分離數據庫訪問和底層數據庫設計。結合可更新/可刪除視圖和「替代」觸發器,您應該能夠很好地完成任務。請記住,這是推薦的設置,即使您僅使用 SQL(以及任何語言),因爲它允許您將程序設計與數據庫設計分離。它可以讓你與iSeries PF分離的事實只是一個好處。

好消息 - 您不必切換所有內容以使用SQL - iSeries實際上設置爲允許您像訪問SQL對象(如視圖和觸發器),就像它是物理文件一樣,使用本機RPG文件訪問。
壞消息 - 不像邏輯文件,視圖無法排序。如果你對邏輯文件使用了大量的鍵控訪問,你的努力可能會很複雜......我還沒有試過用CHAIN操作訪問一個SQL索引來查看它是否允許我訪問記錄的其餘部分,所以我不知道這是否會奏效。


編輯:

終於可以測試這個。事實證明,爲它們的排序訪問索引(就好像是一個鍵控邏輯文件)確實會授予訪問記錄的其餘部分的權限。不知道這是否有助於你。

+0

我正在考慮你在說什麼,但它似乎違背了ORM工具的五穀。他們有自己的解耦關注方式。我沒有把我的頭圍繞使用可更新/可刪除視圖的可行性。謝謝,我會考慮這個。 – Quaternion

+0

如果您正在使用ORM框架(您**未提及),請完全像當前表一樣定義視圖,並讓框架引用視圖。然後,在更改底層數據庫時,更改視圖運行的select語句(以及任何必需的觸發器),但不要更改結果集 - 您的ORM映射甚至不知道其差異。 –

+0

這似乎是最好的方式,希望我已經開始使用它。 – Quaternion

0

我發佈此作爲答案,使我打算在這一點上做的很清楚。任何改進都將被接受爲答案。

在觸發器之後執行插入,更新和刪除兩個表。通過這種方式,參考約束將會啓動並準確地報告給用戶。

刪除和插入觸發器都必須檢查記錄已經存在,以防止產生將被髮回給用戶一個錯誤。

更新觸發器必須檢查在應用更新以防止遞歸之前是否可以更新記錄。

這是觸發我打算用以下形式:

更新觸發將同步兩個表(應用到各表),只做更新,如果記錄不同步:

create trigger tableUpdate after update on fromSchema/tName 
referencing new as n            
for each row mode db2sql           
begin atomic 
    update toSchema/tName target set (<-- all target.columns = n.columns -->) 
     where <-- all target.column's != n.column's -->; 
end 

create trigger tableInsert after insert on fromSchema/tName 
referencing new as n            
for each row mode db2sql           
begin atomic 
    insert into toSchema/tName select      
    t1.*             
    from fromSchema/tName as t1 left join toSchema/tName as t2 
    on <-- t1.pkColumn's = t2.pkColumn's -->         
    where <-- t2.pkColum's IS NULL --> 
end 

刪除觸發器將同步兩個表(當申請:

插入觸發器將同步兩個表(當施加到每個表),僅當記錄不存在插入只有刪除記錄存在的地方:

create trigger utbachDelete after delete on fromSchema/tName 
referencing old as o            
for each row mode db2sql           
begin atomic 
    delete from toSchema/tName target where <-- target.keyValues = o.keyValues -->;               
end 
相關問題