0racle数据库应用中的可更新视图设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0racle数据库应用中的可更新视图设计

摘要:Oracle 数据库管理系统在许多领域都有着广泛的应用,本文主要介绍Oracle 数据库应用当中对可更新视图的设计方法,着重分析了单表视图和多表视图在更新操作的时候需要注意的问题,并根据实例提出了实现可更新视图的具体解决方案。

关键词:Oracle 可更新视图触发器

Oracle 是一个适用于大中型企业、功能强大且较为复杂的对象-关系型数据库管理系统,它在银行、电信、航空、保险、证券等领域都有着非常广泛的应用。在Oracle数据库的应用当中,经常需要涉及到对视图的操作。Oracle 对视图的查询操作没有任何的限制,但是对视图的更新操作往往受到一定的约束。下面介绍如何实现对Oracle可更新视图的设计。

1 视图的概念

视图(View)是从一个或多个基表(或视图)中导出的表,是一个查询定义,也可认为是一个存储的查询(Stored Query)或是一个虚表(Virtual Table)。视图不同于表,一个视图不分配任何存储空间,不真正地包含数据,视图只在数据字典中存储其定义。视图是数据库开发中应用非常广泛的一种数据库对象。由于它具有限制数据访问、简化查询、提供独立数据、允许多个视图使用相同数据、删除视图时不影响基表等特点,使得我们在开发数据库应用时,降低了数据操作

的复杂性、减少了数据层和应用层之间的耦合,最终提高了开发效率。

可更新视图是指可以进行插入、修改和删除数据操作的视图。Oracle 对视图的更新操作有一定的限制,在Oracle数据库中,基于单个基表的视图是可更新的,但对于多表联合的视图,由于它的复杂性,往往受到一定的限制。本文以一个简单的例子说明了视图的基本设计方法,并分析了在Oracle数据库中如何实现对视图的更新。

1.1 建立两个表students和teachers结构

Students表Teachers表字段名类型(长度)含义字段名类型(长度)含义s_idvarchar2(10)学生编号t_idvarchar2(10)教师编号s_namevarchar2(10)学生姓名t_namevarchar2(10)教师姓名s_sexvarchar2(1)学生性别t_sexvarchar2(1)教师性别t_idvarchar2(10)任课教师t_coursevarchar2(10)所任课程

其中students表中的t_id为任课教师编号,与teachers中t_id相关联,在做多表连接时可以认为teachers表为主表(即连接表),students表为从表(被连接表)。下面以students 表和teachers 表为例,设计实现了单表视图s_view1 和多表视图s_view2。

2 单表视图的设计

若一个视图是从单个基表导出的,并且只是去掉了基表的某些行和列,且保留了基表的主码,这样的视图被称为行列子集视图,又称

为单表视图。创建单表视图的方法如下:

create view s_view1 as select s_id, s_name, s_sex from students;

创建的视图s_view1 只涉及到一张表students,并且只是这张表的一部分,将一些不必要的数据隐藏起来,使得部分数据对用户是透明的,增强了系统的安全性。这种方法创建出来的视图是可更新视图,如果在创建视图时加上with read only子句,将其创建为只读视图,则视图即为不可更新。

3 多表视图的设计

3.1主键连接方式

若一个视图是从多个基表中导出,满足一定的连接条件,这样的视图就是多表联合视图。Oracle 数据库中多表视图的更新操作受到了一定的限制,普通的无主键连接将不能进行视图的更新操作,只有主表为键值保存表,并且连接条件中包含主表的主键列时,才能够实现视图非主表列的更新

创建方法为:

alter table teachers add primary key(t_id);

create view s_view2 as select s.s_id,s.s_name,t.t_name,t.t_course from students s,teachers t where s.t_id=t.t_id;

如果主表无主键列、主键列没有当作连接条件或是更新主表列时都将提示错误。

用上述方法创建的多表视图,并不是所有的列都可更新,只有非主表的列(即s_id, s_name)才可以进行更新操作,如果想知道视图中具体哪一列可以更新,可以通过查看SYS方案中DBA_UPDATABLE_COLUMNS视图得到相关信息。

从上面可以看出,这种创建可更新视图的方法还是有一定局限性的,不能对主表列进行更新操作。本文采用Oracle 数据库提供的instead of 触发器能够很好的解决这一问题。

3.2 触发器方式

触发器(Database Trigger)是存储在数据库中的过程,当表或视图被修改时它隐式地被执行。在Oracle 中允许在对表或视图发出Insert、Update或Delete语句时隐式地执行所定义的过程,这些过程称为数据库触发器。

创建触发器的语法如下:

CREATE [OR REPLACE] TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event

ON table_or_view_name [FOR EACH ROW[WHEN condition]]

Oracle数据库中提供了一种INSTEAD OF 触发器,对于包含多个基表的视图,可以通过使用INSTEAD OF触发器来支持基表中数据的插入、更新和删除操作。INSTEAD OF触发器的实质就是阻止Oracle 去尝试解释更新操作的视图定义,而是使Oracle 执行该触发器的主体,依靠触发器的定义来得出有意义的语义。INSTEAD OF 触发器总是为视图而创建的,它始终是FOR EACH ROW触发器,这意味着针对每个可以对视图进行删除、更新或插入操作的行,都要执行一次这个触发器。使用INSEAD OF 触发器的主要优点就是可以使不能更新的视图支持更新,从而扩大了视图的应用范围,对视图的操作更加直接、方便。该触发器中转换表和转换变量的概念与普通触发器中的概念一致。

下面以s_view2为例采用INSTEAD OF方式创建update触发器如下:

create or replace trigger s_tri instead of update on s_view2 for each row

begin

update teachers set t_name=:new.t_name,t_course=:new.t_course

where t_name=:old.t_name;

update students set s_id=:new.s_id,s_name=:new.s_np本文讲述了

相关文档
最新文档