在oracle中通常如果視圖的數據源來自單表則該視圖可以進行更新。而如果視圖數據源來自兩個以上表時這個視圖是不可更新的。但有時候爲了操作的方便我們更希望能夠對多表視圖也進行更新。
這時候我們可以通過建立更新觸發器來替代該視圖原有更新以達到多表更新的效果
例如:
3.1 創建測試數據表
--===================================================
--創建測試表
--===================================================
Drop Table t1;
Drop Table t2;
create table t1
( t11 numeric(28),t12 varchar2(20));
create table t2
( t11 numeric(28),t22 varchar2(20));
3.2 多表視圖範例
--===================================================
--創建測試視圖
--===================================================
create Or Replace view t as
select T1.t11 f1 ,T1.t12 f2 ,T2.t22 f3
from T1,T2
Where T1.t11=T2.t11;
3.3 多表視圖觸發器範例
--===================================================
--創建視圖的替代觸發器
--===================================================
Create Or Replace Trigger Trg_InsUpdDel_t
Instead Of Insert or update or delete
on t
for each row
Declare
begin
If Inserting Then
Insert Into t1 (t11,t12) Values (:New.f1,:New.f2);
Insert Into t2 (t11,t22) Values (:New.f1,:New.f3);
elsif Updating Then
Update t1 set t11=:New.f1,t12=:New.f2 where t11=:New.f1;
Update t2 set t11=:New.f1,t22=:New.f3 where t11=:New.f1;
elsif Deleting then
Delete from t1 where t11=:Old.f1;
Delete from t2 where t11=:Old.f1;
End if;
end;
如此即實現多表可更新視圖的定義工作 。
但要注意當視圖進行重新編譯的時候這個觸發器會失效需要重建。
替代觸發器
當執行數據庫視圖的更新時,就能觸發替代觸發器。大家都知道,數據庫視圖可認爲是派生表。當查詢一個視圖時,事實上是查詢了一個或多個基礎表。當更新視圖時,事實上更新了基礎表。然而,不是所有視圖都能輕易更新的,在某些情況下,Oracle服務器不知道如何處理更新,就會報錯:你所工作的視圖不可更新。替代觸發器用過程代碼替代了觸發語句。下面是相關示例。