看到一篇视图的使用注意事项,虽然都未曾遇到过,转载下,以后借鉴下:
使用数据库视图通常出于以下两个目的:1。降低操作复杂度;视图是预编译的查询操作,一次定义,之后可快速调用;2。提高系统安全。视图作为数据库对象,可以将其权限独立出来赋给用户,可避免用户对基表的盲目危险操作,同时也可屏蔽一部分私密的属性列。
定义语句:
CREATE [OR REPLACE ] [FORCE |NOFORCE ] VIEW YOUR_VIEW_NAME
(COLNAME1,COLNAME2,COLNAME3,...,COLNAMEn)
AS
[YOUR_QUERY_STATEMENTS WILL WRITE HERE !]
[WITH CHECK OPTION [CONSTRAINTNAME constraint_name]]
[WITH READ ONLY ]
对视图的查询操作实际是运行建立视图的sql语句。所以当用户自己修改基表信息时,主表改变,查询视图时也同时输出最新的信息,这样做可以尽可能减少对数据库空间的占用,并且不需要同步操作。
视图也可进行DML操作,但是在操作时要注意以下原则:
条件一:在连接视图中不能有Order by排序语句。
这主要是因为采用了Order by排序语句后,记录的物理存储顺序发生了改变。此时,若在视图上进行了数据更新,则其对应的基础表找不到具体更改的物理位置。所以,会以失败告终。
类似的,也不能够在SQL语句中含有Group by、connetc by等语句。若有这些语句的话,则数据库都不允许对数据进行数据更新操作。
条件二:基础表中所有的NOT NULL列都必须在这个视图中。
若想在视图上进行数据更新操作的话,则必须要求对应基础表中的所有不允许空的字段都在当前的视图中。其实这很好理解,若每个字段不允许为空,则又不在当前的视图中,则新增加记录的时候,这个字段就没有被赋值,故在保存时就会被基础表所拒绝。
另外,需要注意的是,无论是更新还是删除语句,若基础表中的某个非空列不在这个视图中,都无法进行更改。也许有人会问,如果用户不是增加记录,而只是更新数据。那难道也要求在视图中包含所有的非空字段呢?答案是肯定的。因为数据库系统在提交更新事务之前就会对这个条件进行判断。
条件三:需要更新的列不是虚拟列。
在视图中,可能有些列的结果是通过列表达式定义的,在基础表中并不存在。我们把这些列叫做虚拟列。只要在视图中有虚拟列的存在,只要视图中任何一列是由列表达式定义的,那么对不起,整张视图都不能够进行更改。这个控制原理跟上面这个条件是类似的。
可见,在数据库设计的时候,就需要考虑是否需要在视图基础上对表的内容进行更改。若需要更改的话,则一定不能够在视图中采用虚拟列,而宁愿在表中多增加一些字段。或者在数据库视图中不采用虚拟列,而是在前台应用程序中采用虚拟列。
条件四:不能够具有分组函数。
但是,若视图中有这个函数的话,则也不能够对这张视图进行更新。这是Oracle数据库的强制规定。
其实,这也可以通过一些灵活的方式来避免。如在数据库视图中不需要采用分组函数。而是在前台的Select语句中,查用分组函数。因为前台要调用数据库中的数据,仍然需要查用Select语句去查询视图。所以,即使在原始的数据库视图中不对数据进行分组,则在前台应用程序中仍然可以帮助用户完成数据分组与统计的任务。此时,用户若在视图中更改数据的话,不仅可以更新数据库基础表中的内容;而且,还可以及时的反馈到前台的应用程序界面中。
分组函数会增加数据库查询的负担;同时,使得无法在视图上采取DML操作。故数据库管理人员需要跟前台应用程序开发人员进行协商,在前台实现对数据的分组统计,而不是在后台。
但是,若视图中有这个函数的话,则也不能够对这张视图进行更新。这是Oracle数据库的强制规定。
其实,这也可以通过一些灵活的方式来避免。如在数据库视图中不需要采用分组函数。而是在前台的Select语句中,查用分组函数。因为前台要调用数据库中的数据,仍然需要查用Select语句去查询视图。所以,即使在原始的数据库视图中不对数据进行分组,则在前台应用程序中仍然可以帮助用户完成数据分组与统计的任务。此时,用户若在视图中更改数据的话,不仅可以更新数据库基础表中的内容;而且,还可以及时的反馈到前台的应用程序界面中。
分组函数会增加数据库查询的负担;同时,使得无法在视图上采取DML操作。故数据库管理人员需要跟前台应用程序开发人员进行协商,在前台实现对数据的分组统计,而不是在后台。
例如 :
Create Table dept As Select deptno,dname From scott.dept;
Create Table other_dept As select deptno,loc From scott.dept;
Alter Table dept Add Primary Key (deptno);
Alter Table other_dept Add Primary Key(deptno);
然后生成视图如下:
Create Or Replace View chenj_dept
As Select a.deptno,b.loc,a.dname From dept a,other_dept b Where a.deptno=b.deptno;
接着对视图进行DML操作:
Delete From chenj_dept Where deptno=20;
commit;
最后发现dept表中没有deptno=20的记录,但是other_dept中却有
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/cesium/archive/2009/09/01/4508076.aspx