create view test as select 'ss' a from dual
这个视图能更新么
我试着更新,说我没权限

解决方案 »

  1.   

    -- select 'ss' a from tb_name;
    -- 上面这样的视图是不能更新的!
    -- 因为'ss' 是一个常量,而不是你表中的字段!-- 其2:dual是一个虚表,首先搞清楚dual的作用!
      

  2.   

    scott@SZTYORA> conn / as sysdba
    已连接。
    sys@SZTYORA> grant insert on dual to scott;授权成功。sys@SZTYORA> conn scott/bee56915
    已连接。
    scott@SZTYORA> insert into dual(dummy) values('l');已创建 1 行。scott@SZTYORA> select * from dual;DU
    --
    Xscott@SZTYORA> insert into dual(dummy) values('l');已创建 1 行。scott@SZTYORA> commit;提交完成。scott@SZTYORA> select * from dual;DU
    --
    Xscott@SZTYORA> select * from sys.dual;DU
    --
    X
      

  3.   

    - 5.5 视图 ( P202 )
    -- 5.5.1 视图类型 ( P202 )
    -- 视图可从一个或多个表、昵称或视图中派生,且可以在检索数据时与表互换使用。当对视图中显示的数据进行更改时,该数据会在表中自行更改。
    -- 在创建视图之前,视图所基于的表、昵称或视图必须已经存在。-- 可以创建视图来限制对敏感数据的访问,同时又允许对其他数据进行更多的一般访问。-- 当插入到一个视图中,而其视图定义中的选择列表直接或间接地包括一个表的标识列的名称时,标识列的同一规则也适用,
    -- 就像INSERT语句直接引用该表的标识列一样。-- 除按上述方式使用视图外,视图还可以用于:
    -- *(1) 改变表而不影响应用程序。这可通过一个基于基础表的视图来完成。使用基础表的应用程序不会因新视图的创建而受影响。
    --      新的应用程序可将创建的视图用于与那些使用基础表的应用程序不同的目的。
    -- *(2) 对于一些列中的值求和,选择最大值,或计算平均值。
    -- *(3) 访问一个或多个数据源中的信息。可在CREATE VIEW语句内引用昵称,并可创建多个位置/全局视图(该视图可以连接位于不同系统中多个数据源的信息)。
    --      当使用标准的CREATE VIEW语法创建一个引用昵称的视图时,将看到一个警告,警告目前视图用户的谁标识,而不是视图创建者谁标识将用于访问数据源处的基本对象。
    --      使用FEDERATED关键字可以阻止此警告。-- 视图是高效率的数据呈示方法(无需维护数据)。视图不是实际的表,不需要永久存储器。“虚拟表”是即创建即使用的。-- 视图提供了另一种查看一个或多个表中的数据的方法。视图和表一样具有列和行。可以像使用表一样将所有视图用于数据检索。
    -- 是否可以插入、更新或删除操作中使用视图取决于它的定义。......-- 视图有以下几种类型:-- *1) 系统目录视图
    -- 数据库管理器维护一组表和视图,这些表和视图包含关于数据库管理器所控制的数据的信息。这些表和视图统称为系统目录。
    -- 系统目录包含关于数据库对象(例如表、视图、索引、程序包和函数)的逻辑和物理结构信息。它还包含统计信息。数据库管理器确保系统目录中的描述始终准确。-- 系统目录视图类似于任何其他数据库视图。可以使用SQL语句来查询系统目录视图中的数据。可以使用一组可更新的系统目录视图来修改系统目录中的某些值。
    -- 关于系统目录视图的详细信息,请参见<<深入解析DB2-高级管理、内部体系结构和诊断案例>>一书。-- *2) 可删除视图
    -- 根据定义视图的方式,视图可以是可删除视图。可删除视图是可以对其成功发出DELETE语句的视图。
    -- 只有在遵循下列规则的情况下,一个视图才能被视为可删除视图:
    -- *(1) 外部全查询的每个FROM子句仅标识一个表(不带有OUTER子句)、可删除视图(不带有OUTER子句)、可删除的嵌套表达式或可删除的公共表表达式。
    -- *(2) 数据库管理器应该能够使用视图定义来派生表中要删除的行。下列操作使视图变得不可删除:
    --    *(A) 使用GROUP BY子句或列函数将多行分组成一行将导致原始行丢失并使得视图不可删除。
    --    *(B) 同样,从VALUES派生行时,没有要删除行的表。视图也将不可删除。
    -- *(3) 外部全查询不使用GROUP BY或HAVING子句。
    -- *(4) 外部全查询的选择列表中不包括列函数。
    -- *(5) 外部全查询不使用集合操作(UNION、EXCEPT或INTERSECT),但UNION ALL除外。
    -- *(6) UNION ALL的操作数中的表不能是相同的表,并且每个操作数必须可删除。
    -- *(7) 外部全查询的选择列不包括DISTINCT。-- 一个视图必须符合上面列示的所有规则才能被视为可删除视图。例如,下列视图是可删除视图。它遵循可删除视图的所有规则。
    CREATE VIEW deletable_view (number, date, start, end)
    AS SELECT number, date, start, end
    FROM employee.summary
    WHERE date='01012007'-- *3) 可插入视图
    -- 可插入视图允许您使用视图定义来插入行。如果对视图定义了用于插入操作的INSTEAD OF触发器,或者视图中的至少一列可更新(与用于更新的INSTEAD OF触发器无关),
    -- 并且视图的全查询不包括UNION ALL,那么该视图是可插入视图。当且仅当给定行正好满足一个基础表的检查约束时,才能将该行插入到视图中(包括UNION ALL)。
    -- 要插入到包含不可更新列的视图中,必须从列列表中省略这些列。-- 下面创建的视图是一个可插入视图。但是,在本示例中,尝试插入视图将失败。这是因为表中存在不接受空值的列。这些列中的某些列未出现在视图中。
    -- 尝试使用视图来插入值时,数据库管理器会尝试将一个空值插入到NOT NULL列中,不允许执行此操作。
    CREATE VIEW insertable_view (number, name, quantity)
    AS SELECT number, name, quantify
    FROM ace.suplies-- *4) 可更新视图
    -- 可更新视图是一种特殊的可删除视图。如果可删除视图中的至少一列可更新,那么该可删除视图就变成了可更新视图。
    -- 当满足下列所有规则时,视图中的一列将可更新:
    -- *(1) 视图是可删除视图
    -- *(2) 列解析为表列(不使用解引操作)并且未指定READ ONLY选项
    -- *(3) 如果视图的全查询包含UNION ALL,那么UNION ALL的操作数的所有相应列具有完全匹配的数据类型(包括长度或精度和小数位)以及完全匹配的默认值。-- 以下示例使用无法更新的常量值。但是,视图是可删除视图并且该视图中至少一列可更新。因此,它是可更新视图。
    CREATE VIEW updatable_view (number, current_date, current_time, temperautre)
    AS SELECT number, current date, current time, temperature
    FROM weather.forecase
    WHERE number = 300-- *5) 只读视图
    -- 如果一个视图不可删除、更新或插入,那么该视图是只读视图。SYSCAT.VIEWS目录视图中的READONLY列指示视图是只读(R)视图。-- 下面创建的视图不是只读视图,因为它使用了DISTINCT子句并且SQL语句涉及多个表:
    CREATE VIEW read_only_view (name, phone, address)
    AS SELECT DISTINCT viewname, viewphone, viewaddress
    FROM employee.history adam, employer.dept sales
    WHERE adam.id = sales.id
      

  4.   

    你在一个实际有数据的表上建立试图,然后更新一下?
    dual表最好不要用来做更新试图的测试
      

  5.   

    视图是真实表的某种映射,对视图的修改最终反映到基表的修改.
    再来看看你的视图.
    你的视图基于dual,视图与基表间唯一的关系就是基表中的数据条数,也就是说基表的条数影响了视图中数据的条数.由于视图中列的值与基表无任何关系,所以无法通过对基表的修改来完成对视图的更新.所以你的视图无法做update.并且你也无法向视图增加数据,因为插入的数据不能判断应该如何对基表进行处理.
    你做的只能是delet from test;如果删除时报错权限不足,请在sys下执行grant delete on dual to scott;