我正在學習大學課程的SQL和DB設計。賦予我們的一項任務是創建一個具有派生屬性的表格,這是一些子屬性的SUM。例如:如何防止將派生值(SUM)手動更新爲不正確的值
ORDERS
orderID {PK}
/orderTotal /* derived from SUM of child itemTotals */
ITEMS
itemNo {PK}
orderID {FK}
itemTotal
現在,我甚至不確定這是好的做法。從我在網上完成的一些閱讀中,派生值不應該被存儲,而是由用戶應用程序計算。我可以理解這種觀點,但在這種情況下,我的任務是存儲派生值,更重要的是通過觸發器保持其完整性,這對我來說是比較新的,所以我很享受使用它們。我還想象一下,在一些更復雜的情況下,保存處理時間真的值得存儲派生值。以下是我已經設置的不會給我帶來問題的安全措施:
插入新子項時更新父/訂單總計的觸發器。
刪除子項目時更新parent/orderTotal的觸發器。
當修改child itemTotal時更新parent/orderTotal的觸發器。
但是,還有另一個我想要的保障,我無法弄清楚如何完成。由於派生了父屬性/ orderTotal,因此不應手動修改它。如果有人試圖手動修改它(對於實際上不是正確的SUM的錯誤值),我想要(a)阻止他們這樣做或(b)一旦完成就將其恢復到其舊值。
哪種方法更好,哪些可能(以及如何)?我不知道如何完成前者,我試圖通過觸發器或約束來完成後者,但似乎都不合適。觸發器方法不斷給我ORA-04091錯誤試圖改變觸發表的觸發器。約束方法,我不認爲是合適的,因爲我不知道如何在約束檢查內做這樣的特定事情。
我在SQL Developer中使用Oracle SQL的方式。
謝謝!
我會質疑在數據庫中使用觸發器來更新派生值之前,我會質疑存儲派生值的適當性的適當性。爲什麼不讓應用程序的業務邏輯直接設置該字段?這樣,如果有特定地點的稅收和/或運費等事情,則業務邏輯可以計算並存儲正確的派生值,並將這些值考慮在內。 – aroth
@aroth:他把它描述爲一個DB類的賦值,所以沒有選擇在哪裏做。 – jmoreno