可更新視圖及其規則

引用:

http://blog.csdn.net/yanchencheng/archive/2008/10/15/3082251.aspx

http://xu20cn.blog.51cto.com/274020/66092

 

1 前言
多表視圖的定義:當視圖的數據源只有一張數據表,則該視圖爲單表視圖;當視圖的數據源是多張數據表,則該視圖爲多表視圖。
可更新視圖的定義:在絕大多數人的概念中,視圖是隻讀的,不允許修改。ORACLE 8i以上版本,單表視圖如果沒有設定With Read Only,則該視圖是可以更新的,對視圖的操作將直接寫入的數據表中。
那麼,如果視圖的數據源是多張數據表,而多表視圖如果實現可更新視圖,則可以大大提高編碼的效率。

2 多表可更新視圖的應用範圍
在程序實現過程中,我們往往會將諸如產品編號、計量單位、客戶信息等等存儲於獨立的數據表,在銷售單據、出入庫單據等處,引用其主鍵ID,就可以指向相關詳細信息。
在查詢視圖上,我們僅需要確定關聯關係即可,但在數據錄入界面,我們要實現多表信息同步編輯功能時,往往會遇到困擾。需要應用各種各樣的編程方法,實現用戶需求。
多表可更新視圖大大簡化前臺編程的工作量,對於前臺FORM,可以認爲該多表可更新視圖就是一張完整的業務數據表,而數據的存儲邏輯則建立於後臺視圖的Instead of 觸發器中。

3 多表可更新視圖的後臺實現
建立多表視圖的Instead Of Trigger,在Trigger中定義數據存儲邏輯,就實現了多表可更新視圖<複雜的技術難點,解決的方法往往是無比簡單的>。實例如下:
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;
如此即實現多表可更新視圖的定義工作,大家可以試着使用Insert或Delete或Update的SQL語句測試一下。
3.4 數據庫後臺注意事項
當視圖使用Create Or Replace View...重新編譯後,該觸發器就會被覆蓋,找不到了。所以大家記得在重新編譯多表可更新視圖之後,要重新創建其觸發器。

4 多表可更新視圖的前臺實現及注意事項
4.1 基本實現
在數據源中,定義數據塊的數據源爲多表可更新視圖,即可實現前臺設定。
當然還有許多注意事項,否則大家在實際應用過程中就會覺得困難重重。
4.2 FORM前臺注意事項
4.2.1 主鍵,如果多表可更新視圖中,包括外聯<如:Where t1.t11=t2.t11(+)>,則必須在FORM中定義主鍵,包括數據塊的主鍵和數據項的主鍵屬性。否則,FORM將會提示“視圖不允許更新”。
4.2.2 SQL,多表視圖如果使用Union或Distinct,則前臺FORM可能無法實現更新功能。

 

 

可更新視圖有以下三條規則:

(1) 若視圖是基於多個表使用聯接操作而導出的,那麼對這個視圖執行更新操作時,每次只能影響其中的一個表。

(2) 若視圖導出時包含有分組和聚合操作,則不允許對這個視圖執行更新操作。

(3) 若視圖是從一個表經選擇、投影而導出的,並在視圖中包含了表的主鍵字或某個候選鍵,這類視圖稱爲‘行列子集視圖’。對這類視圖可執行更新操作。

***
關於可更新視圖的一些更具體的描述如下。

如果視圖沒有INSTEAD OF觸發器,或者視圖不是分區視圖,則視圖只有滿足下列條件纔可更新:

select語句在選擇列表中沒有聚合函數,也不包含TOP,GROUP BY,UNION(除非視圖是分區視圖)或DISTINCT子句。聚合函數可以用在FROM子句的子查詢中,只要不修改函數返回的值。

select語句的選擇列表中沒有派生列。派生列是由任何非簡單列表達式(使用函數、加法或減法運算符等)所構成的結果集列。

select語句中的FROM子句至少引用一個表。select語句不能只包含非表格格式的表達式(即不是從表派生出的表達式)。

INSERT, UPDATE和DELETE語句在引用可更新視圖之前,也必須如上述條件指定的那樣滿足某些限制條件。只有當視圖可更新,並且所編寫的UPDATE或 INSERT語句只修改視圖的FROM子句引用的一個基表中的數據時,UPDATE和INSERT語句才能引用視圖。只有當視圖在其FROM子句中只引用 一個表時,DELETE語句才能引用可更新的視圖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章