2011-08-11 161 views
1

可以說我有一個表IDPARENT_IDOracle:更新樹觸發器

我想創建一個「on update」觸發器,所以無論何時更新ID,指向ID的任何PARENT_ID也會更新。

但是我能看到的主要問題是,我不認爲Oracle允許您從當前正在執行觸發器的表中進行選擇。

我知道我可以在PL/SQL函數中包裝「更新」代碼,但我有用戶可能更適合用SQL來操作這些數據。

什麼是最好的方式來實現我所追求的,而不會強迫用戶調用更多的PL/SQL(我很高興用PL/SQL來實現它,只要它對用戶來說是相當透明的) 。

回答

1

我最終通過在表上創建視圖並使用instead of觸發器使視圖可更新來實現此目的。這個而不是觸發器對基表中的ids和parent_id進行了適當的更新。

1

即使PL/SQL嵌套到觸發器中,也會在此處引發突變。

這聽起來像是一個正常化問題。爲什麼你需要更新另一行?我會建議看看你正在維護的價值,並將其移動到另一個表...

也有一個不一定推薦的方式來有時避開合法的變異... PRAGMA AUTONOMOUS_TRANSACTION - 我會留給它你看看:)

+0

+1得到了同意,除了它在技術上不是一個正常化問題 - 而是一個選擇自然鍵而不是代理的問題。 –

1

你需要一個包和兩個觸發器。第一個觸發器是after update for each row。它保存在包全局變量中更新的id。

第二個觸發器是after update trigger (without for each row)。此觸發器可以從包全局變量更新ID的parent_id

+0

同意。如果兩個不同的會話同時更新同一父級的兩個不同子級記錄,請記住考慮併發性問題。 –