多表關聯後的數據能保證主鍵唯一的視圖是可直接做更新,不需要用觸發器實現
多表視圖的定義:當視圖的數據源只有一張數據表,則該視圖為單表視圖;當視圖的數據源是多張數據表,則該視圖為多表視圖。
可更新視圖的定義:在絕大多數人的概念中,視圖是只讀的,不允許修改。Oracle 8i以上版本,單表視圖如果沒有設定With Read Only,則該視圖是可以更新的,對視圖的操作將直接寫入的數據表中。
那麼,如果視圖的數據源是多張數據表,而多表視圖如果實現可更新視圖,則可以大大提高編碼的效率。
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,