`

对视图进行 DML 操作

阅读更多
    以前只知道视图可以用来查询,最近才知道,原来视图还是可以像普通表一样进行增、删、改操作的。而我们通常用写的视图虽然仅仅只是用来进行查询,而且在建立查询视图的时候,我们从来没有考虑到将视图建立成只读格式,我意识到,事实上我们的视图是不安全的。
接下来,我将详细说明如何对视图进行数据的添加、修改和删除。
在切入主题之前,首先说明一下视图的格式定义:


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]


说明:
    首先我想说一下 FORCE 与 NOFORCE 的区别,有时候你在创建视图时可能会报一个“表或视图”不存在的错误。如果选择了 FORCE 选项,不论你的 SQL 是否有问题,只要符合语法规则,Oracle 都会按照你的意图将其创建。这样你就可以在视图建立好以后再建表,或者向表中加字段。
其次就是 WITH CHECK OPTION ,这个条件一般对于查询类视图是没有太大的用途的。但是如果你要执行DML操作,那么,这个检查将会限制你只能访问被 Where 子句所限制了的记录。更或者确切的说,如果你所执行的操作影响到视图中的一条记录不再满足视图的限制条件,那么,Oracle 就不会允许你进行该操作。这样,事实上就保证了视图中数据的完整性。
最后,也是最重要,用来保证视图安全性的 WITH READ ONLY 指令。默认情况下,Oracle中的视图如果没有申明只读,理论上都可以执行DML操作。因此,如果要保证你的视图是只读的,那就应该显式声明一下。其实,如果业务上没有在视图上执行 DML 操作的需求的话,一般建议在建立视图时都将其声明为只读格式的,这样不但保证了视图中数据不会被非法修改,而且从一定程度上还可以提升视图的执行效率。

    说了半天的闲话,我们现在开始聊聊如何对视图执行DML操作。如果是简单视图,而且没有声明 WITH READ ONLY 那你就放心大胆的执行吧,没什么不行的,为了说明问题,我们先小试牛刀。



一:简单视图执行的 DML 操作

首先,将设库中已经有Dept这张表,我们建一个视图,命名为 V_Dept ,定义过程如下:

1>用到的表定义:

CREATE TABLE DEPARTMENT
(
  DEPARTMENTID  VARCHAR2(32 BYTE)               NOT NULL,
  NAME          VARCHAR2(32 BYTE)               NOT NULL,
  INNERCODE     VARCHAR2(3 BYTE)                NOT NULL,
  FULLNAME      VARCHAR2(32 BYTE),
  STATUS        VARCHAR2(1 BYTE)                NOT NULL,
  COMMENTS      VARCHAR2(100 BYTE)
)


2>视图定义:

    CREATE OR REPLACE VIEW V_Dept
    AS SELECT * FROM DEPT


    从定义中可以看出,事实上我们这里的定义方式跟 Oracle 视图定义的标准格式还有些出入,不过没关系,Oracle 在遇到没有定义字段名的视图时他会自动将原表中的字段名称当做视图的字段名称。执行编译,系统提示view created 。OK,我们接下来对这个简单视图进行数据的修改、增加和删除。

首先我们对视图进行一次数据查询,执行如下:

select * from v_dept

返回消息>>11 rows return

OK , 首先保证我们的表中有数据(没有数据的仁兄们就得自己想办法喽^^)。然后小试牛刀让我们来执行一条插入语句:

Insert into v_dept
   (DEPARTMENTID, NAME, INNERCODE, FULLNAME, STATUS, COMMENTS)
 Values
   ('SP13618d5cWWWWW', '后勤公司', '17', '后勤服务公司', '0', '主要用于教学场地的管理');
COMMIT;

返回消息>>1 row inserted

OK , 说明简单视图可以执行插入语句,接下来我们再试一下修改语句,我们同样还是修改刚才插入的这条记录:

修改:update v_dept set DEPARTMENTID='SP13618d5c' where DEPARTMENTID='SP13618d5cWWWWW';
删除:delete v_dept where DEPARTMENTID='SP13618d5c'

执行上面的两条语句,我们可以看到对于简单视图我们可以像对真实表一样进行 DML 操作。那么对于复杂视图呢?

二:复杂视图在有条件的情况下执行 DML 操作。

具体的限制条件如下:
1〉不允许违反约束的 DML 操作。
2〉不能将一个值添加到包含算术表达式的列中
3〉在非 key-preserved 表上不允许 DML 操作 .
4〉在包含组函数、GROUP BY 子句、ROWNUM伪列或DISTINCT关键字的视图上不允许 DML 操作。

>>未完待续....
分享到:
评论

相关推荐

    把触发器说透

    - **替代触发器(INSTEAD OF)**:在Oracle中,如果试图直接对视图进行DML操作,这是不允许的。替代触发器提供了一种解决方案,使得可以通过视图进行数据操作,并在底层实际的表上执行相应的操作。 - **系统触发器*...

    索引与视图

    创建,修改,删除索引的方法 基于函数索引的特点 位图索引的特点 创建和管理视图的方法 对视图进行DML操作的方法 内嵌视图的应用特点

    触发器在Oracle数据库中的应用研究.pdf

    3. 替换触发器:定义在视图上,当对视图进行DML操作时,实际上是操作其基础表。 4. 用户事件触发器:响应用户的特定登录、退出等事件。 5. 系统事件触发器:响应数据库系统的启动、关闭、异常错误等事件。 以Oracle...

    关于oracle触发器before和after的应用问题

    替代触发器会在试图对视图进行DML操作时激活,从而实现底层表的间接更新。 #### 系统触发器 系统触发器是一种特殊类型,可在数据库启动或关闭时触发,用于执行初始化或清理任务,确保数据库环境的一致性和安全性。...

    plsql 触发器

    替代触发器在尝试对视图进行DML操作时被触发,并执行相应的代码来代替实际的DML操作。这使得开发者能够在视图层面上执行复杂的逻辑。 ##### 2.3 系统触发器 系统触发器是一类特殊的触发器,用于响应Oracle数据库...

    Oracle数据库入门学习课件ppt

    - 更新视图:根据规则允许对视图进行DML操作。 8. **备份与恢复**: - 备份策略:完整备份、增量备份、差异备份。 - RMAN(Recovery Manager):Oracle的备份和恢复工具。 - 数据库恢复:使用备份文件和Redo...

    Oracle数据库开发实用教程第7章.pptx

    `INSTEAD OF`触发器是在视图上定义的,当对视图进行DML操作时,会替代实际的DML操作执行。这允许我们在视图上执行复杂的操作,而无需直接操作底层表。创建`INSTEAD OF`触发器的语法如下: ```sql CREATE OR REPLACE...

    Oracle触发器详细

    3. **INSTEAD OF触发器**:在试图对视图进行DML操作时触发,而不是实际的数据表。 4. **系统条件触发器**:响应数据库级的特定系统事件,如启动或关闭数据库。 5. **用户事件触发器**:由用户定义的事件触发,如登录...

    oracle视图的增删改查操作举例[参考].pdf

    对视图进行增删改查操作时,需要注意一些限制。视图可以用于查询,但插入和修改操作可能会受到限制。例如,如果视图包含聚合函数或GROUP BY子句,那么通常不允许在该视图上执行DML(数据操纵语言)操作。然而,如果...

    hive 表 dml 操作.zip

    在实际工作中,理解并熟练运用这些Hive的DML操作,能够有效地管理和分析大数据集。对于“产品说明.zip”和“文档.pdf”,它们可能包含了更深入的操作指南、示例代码以及最佳实践,帮助用户更好地理解和应用Hive的DML...

    实验四 SQL语言的DML,DDL和DCL初步

    本次实验了解DML语言的INSERT、UPDATE、DELETE对数据的操作,学会SQL Server的查询分析器中用DML语言对表中的数据进行插入、删除和修改。了解DDL语言的CREATE、DROP、ALTER对视图的操作,学会SQL Server的查询分析器...

    数据库 视图

    - **复杂视图**:数据来自多个表,可能包含函数或数据分组,不一定允许通过视图进行DML操作。 3. **视图的使用**:可以从视图中检索数据,如同从普通表中一样,可以显示整个视图的内容或特定的行和列。 4. **数据...

    SQL Server 利用触发器对多表视图进行更新的实现方法

    本示例展示了如何利用触发器来实现对多表视图的更新,具体涉及了以下几个关键知识点: 1. **触发器的类型**: - 在SQL Server中,有DML(Data Manipulation Language)触发器和DDL(Data Definition Language)...

    oracle创建视图课件

    6. **操作视图**:创建视图后,可以通过`SELECT`语句从视图中检索数据,也可以使用`INSERT`、`UPDATE`和`DELETE`操作对视图进行数据操作,但这取决于视图的定义和Oracle的更新规则。有些视图可能不允许DML操作,或者...

    DDL与DML详解

    在Oracle中,DML操作是事务的一部分,可以使用`COMMIT`提交更改,或者使用`ROLLBACK`撤销未提交的更改。此外,`TRUNCATE`语句虽然看似DML,但实际上属于DDL,因为它涉及的是数据结构的改变,而不是单个数据记录的增...

    ORACLE中查找定位表最后DML操作的时间小结

    但请注意,这个视图只保存了最近的修改信息,对于更长时间前的DML操作可能无法提供准确信息。 第三种方式是通过审计功能。Oracle数据库提供审计功能,可以记录所有或特定的DML操作。审计记录存储在审计表或操作系统...

    sql server视图详解

    - **可更新视图**:如果视图基于可更新的查询,且满足特定条件(如没有使用聚合、GROUP BY、DISTINCT等),则可以执行DML操作。但更新可能会影响多个基础表。 ### 视图的修改与删除 要修改已存在的视图,可以使用...

    数据库操作与视图

    【数据库操作与视图】是关于使用Transact-SQL对数据库进行数据操作和视图创建的知识点。Transact-SQL是SQL的一个扩展,主要用于Microsoft SQL Server。数据操作语言(DML)包括四个主要命令:SELECT、INSERT、UPDATE...

    mysql的dml操作.docx

    以下是关于DML操作的一些详细说明: 1. **插入数据(Insert)**: 插入数据到表中通常使用`INSERT INTO`语句。例如: ```sql INSERT INTO stu (id, name, sex, age) VALUES ("001", "张三", "man", 20); ``` ...

    第5课+MaxCompute+DML操作.docx

    总的来说,MaxCompute的DML操作主要集中在数据的插入和查询,而它的设计和实现都是为了应对大数据环境下的批量处理任务,而不是实时查询和更新操作。了解这些特性对于有效利用MaxCompute进行大数据分析至关重要。在...

Global site tag (gtag.js) - Google Analytics