关于视图的更新问题

来源:互联网 发布:js md5算法 编辑:程序博客网 时间:2024/06/04 18:52

首先创建一个示例视图:

CREATE OR REPLACE  VIEW  myview AS

SELECT *FROM emp WHERE deptno=20;

 

创建视图的时候存在两个选项:

选项一:WHIT CHECK OPTION;

上面创建的视图,存在一个创建条件“WHERE deptno=20”,现在我们更新这个视图:

UPDATE myview SET deptno=30 WHERE empno=7369;(执行此语句,不报错)

此时更新的是一张视图,但是视图本身并不是一个具体的数据表,而现在更新的操作又是

视图的创建条件,很明显这样的做法不可取!

此时为了解决这个问题,可以加入WHIT CHECK OPTION:

CREATE OR REPLACE  VIEW  myview AS

SELECT *FROM emp WHERE deptno=20

WHIT CHECK OPTION;

此时再次执行更新操作:

UPDATE myview SET deptno=30 WHERE empno=7566;

报错:

ORA-01402;视图 WHIT CHECK OPTION where 子句违规

意味着现在不能更新视图的创建条件!

选项二:WHIT READ ONLY

虽然使用了WHIT CHECK OPTION可以保证视图的创建条件不被更新,但是这个条件并不能

保证其他的字段不被更新。

UPDATE myview SET sal=9000 WHERE  empno=7369;(执行此语据,没有报错。)

于之前的问题一样,视图本身不是真是的数据,而是一些查询语句,所以这样的更新仍然不合理!

对于此,我们可以使用WHIT READ ONLY,将其设置为只读视图!

CREATE OR REPLACE  VIEW  myview AS

SELECT *FROM emp WHERE deptno=20

WHIT READ ONLY;

此时再次进行更新操作,

UPDATE myview SET sal=9000 WHERE  empno=7655;

则直接报错:

ORA-01733:此处不允许虚拟列

 

 

以上知识简单的更新视图的操作,如果视图的查询语句中含有统计操作,则根本就不可能更新!

 

 

 

 

 

 

 

 

原创粉丝点击