2012-01-12 32 views
0

我有一個觸發器,通過id連接一個表的列,並將其插入到一個新的表。當在表A中進行更新,插入,刪除時,它將按ID並連接column1並將其插入到表B中。觸發器按列連接成新表

問題是當觸發器觸發時,Oracle引發異常變異表。這是因爲觸發器運行查詢:

delete from tableb where id = :id; 
insert into tablea (id, col1) 
select id, wm_concat(col1) from tablea group by id 

如何使用觸發器修復此問題? (不能使用存儲過程,並希望避免使用計劃任務)。

+0

你可以使用物化視圖嗎? – Craig 2012-01-12 20:30:26

+0

每當你對'tablea'執行DML操作時,你也會插入'tablea'? – Ben 2012-01-12 21:18:30

+0

你的意思是'insert into tableb'? – APC 2012-01-12 22:36:21

回答

1

「我該如何解決這個問題使用觸發器?(不能使用存儲過程和 想避免使用計劃任務)。」

沒有辦法只用觸發器來做到這一點。

您不能使用行級觸發器,因爲正如您發現的那樣,select會引發突變表異常。

您不能使用表級觸發器,因爲我們無法在其中引用:NEW或:OLD值。

通過在行級別觸發器中填充名稱空間變量,但上下文需要一個存儲過程(您稱爲無法創建),可以將NEW:OLD值傳遞給表級觸發器。

表怎麼樣?你會被允許創建一個表來傳遞受影響的ID嗎?

但是,實現一個令人討厭的功能是一個很大的開銷。 ORA-04091異常幾乎總是表明數據模型存在缺陷,而且這裏肯定會出現這種情況。

+0

所以唯一的方法是創建一個新表,並有一個行級別觸發器插入受影響的ID到它。然後有一個表級別的觸發器來處理id的權利? – firebird 2012-01-13 16:14:02