我有一個奇怪的業務需求,讓我難倒了。一些背景:基本上,我有兩張用於跟蹤程序增強的表格:增強和Bug。 Enhancement-> Bug的關係是1:m,Bug表有一個外鍵列EnhancementID。數據庫設計:基於另一個表的狀態
這兩個表都有一個「狀態」列,但這是棘手的地方。我的要求是增強的狀態取決於其相關的錯誤。例如,如果我們有3個增強ID爲100的錯誤和「正在測試」狀態,則增強100的狀態應該自動設置爲「正在測試」。有幾個這樣的狀態規則。
這個數據庫由幾個應用程序共享,所以我的第一個想法是在Bug表上使用「On Update」觸發器。因爲觸發器在觸發表中有Select語句,所以我收到了一個「mutating table」錯誤(當觸發器觸發時,我必須查詢具有指定EnhancementID的所有錯誤的狀態)。現在,我試圖實現一個三觸發器解決方案,如下所示:http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936但我越來越擔心在數據庫觸發器中放置如此多的邏輯。
所以我的問題是:我是否合理地接近這個問題?有人可以建議更好的方法嗎?也許使用增強狀態的視圖?
我實際上是根據Tom Kyte提供的解決方案中的建議來構建觸發器。另一個問題是,我無法真正改變應用程序以使用當前增強表中的不同表格。根據這個視圖是否可以更新增強表的狀態? – user2811300
所以你正試圖解決帶有觸發器的應用程序,那一定是......不愉快!你可以重新命名你的表格並調用視圖「增強」,但這可能會引發更多的問題。實際上,如果您無法控制應用程序,意想不到的後果將很難預測。 –
同意@VincentMalgrat - 如果可以,請使用視圖。除非你有某種形式的鎖定(建議的基於觸發器的解決方法沒有),基於觸發器的方法無法正常工作 - 基本問題是觸發器無法「看見」其他事務所做的更改(如添加或更新狀態爲「正在測試」的另一個錯誤)。 –