oracle視圖更新,替代觸發器

在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服務器不知道如何處理更新,就會報錯:你所工作的視圖不可更新。替代觸發器用過程代碼替代了觸發語句。下面是相關示例。

 
 
假設你想要把會計部門的平均工資減少2%的額度(這明顯是個假設的例子)。
 
 
該視圖是不可更新的。Oracle服務器不能指出哪個員工(或哪些員工)應該被調整,以改變部門的平均工資。替代觸發器可以提供所需的邏輯。例如,我們可以把部門裏的薪資調整平均地放到每一個員工身上。
 
 
注意 DNAME列用來訪問dept行。爲了避免出現問題,DNAME列應該被聲明爲唯一。
 
 
替代觸發器類似於DML行觸發器,它對每行都產生影響,並能訪問:OLD和:NEW值。
 
 
因爲我們創建了更新觸發器,而不是INSERT或DELETE觸發器,所以無法對該視圖執行插入或刪除。
 
 
當討論到開啓版本功能的(version-enabled)表時,還會再回到替代觸發器。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章