多表可更新视图的实现

转载 2007年09月19日 13:30:00

多表关联后的数据能保证主键唯一的视图是可直接做更新,不需要用触发器实现

 

多表视图的定义:当视图的数据源只有一张数据表,则该视图为单表视图;当视图的数据源是多张数据表,则该视图为多表视图。
可更新视图的定义:在绝大多数人的概念中,视图是只读的,不允许修改。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,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可能无法实现更新功能。  

SQL92,SQL SERVER,ORACLE,DB2可更新视图概述

1.视图概述 视图是从一个或多个基表(或视图)导出的表。通常视图仅仅是一个虚表,即数据库中只存放视图的定义信息等元数据,而不存放视图对应的数据。 视图上的操作和基表类似,但是 DBMS对视...
  • lionzl
  • lionzl
  • 2011年05月13日 11:41
  • 580

使MSSql Server 视图可更新

1. 创建视图 2. 添加触发器 Create Trigger triggerName On ViewName Instead of Insert --用于Insert操作 as Be...
  • lchyz89
  • lchyz89
  • 2012年08月28日 08:39
  • 453

Oracle 多表视图更新

1 前言 多表视图的定义:当视图的数据源只有一张数据表,则该视图为单表视图;当视图的数据源是多张数据表,则该视图为多表视图。 可更新视图的定义:在绝大多数人的概念中,视图是只读的,不允许修改。...

FORM 更新多表视图(Form直接更新View对应的数据表)

一般来说,多表视图在Form是不可以直接更新的。但是视图有其方便性(就是可以串出很多需要的栏位,不需要在Form的Post-query或者其他触发器中特别写代码赋值), 所以很多时候我们需要Form...
  • samt007
  • samt007
  • 2012年09月21日 17:54
  • 1900

同一个数据库实例,不同用户下多表创建视图,Hibernate完成ORM映射,Spring整合,后台实现

同一个数据库实例,不同用户下多表创建视图,Hibernate完成ORM映射,Spring整合,后台实现 1、同一个数据库实例,同用户,多表创建视图 2、同一个数据库实例,不同用户下,多表创建视图 3、...

可更新物化视图复制站点

可更新物化视图说明 1.可更新的物化视图必须属于一个物化视图组。 2.可更新的物化视图总是基于单表,尽管能够在子查询中引用多个表。 3.可更新的物化视图能够快速刷新。 4.oracle将可更新...

[朝花夕拾]可更新视图

可更新视图 1.视图概述    视图是从一个或多个基表(或视图)导出的表。通常视图仅仅是一个虚表,即数据库中只存放视图的定义信息等元数据,而不存放视图对应的数据。 视图上的操作和基表类似,...
  • zedware
  • zedware
  • 2014年03月04日 21:59
  • 20675

使用FusionCharts创建可更新数据的JavaScript图表

先创建一个简单的图表,然后改变它的数据(请参见下面的代码)。图表最初据显示8月份的销售数据,当用户点击按钮时改为显示9月份的销售数据。每个月都有单独的XML文件,代码如下: Update...

使用explain分析及优化由多表(三个以上)组成的视图性能

使用explain分析及优化由多表(三个以上)组成的视图性能 总结: 1、建立多表(三个表或以上)关联视图时,如果是主表和副表都有的字段,尽量使用主表的字段(特别是主表的主键) 2、副表的字段(无论是...

SQL回炉系列(二) 多表联合查询和视图

多表联合 日期截取比较 排序 视图
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多表可更新视图的实现
举报原因:
原因补充:

(最多只允许输入30个字)