database - Oracle ALL_UPDATABLE_COLUMNS 内容

标签 database oracle oracle11g oracle10g

想了解Oracle系统表ALL_UPDATABLE_COLUMNS的内容。 documentation

ALL_UPDATABLE_COLUMNS describes all columns in a join view that are updatable by the current user, subject to appropriate privileges.

我了解连接 View 中的某些列如何无法更新,但令我惊讶的是,从该表中选择时,我发现常规表及其列也列在此处。是否存在常规表的特定列不可更新的情况? (假设我有表级别的更新权限)

最佳答案

在某些情况下,表的列是不可更新的。例如,如果我创建一个虚拟列(尽管这仅在 11.1 中可用),我无法更新该列中的数据

SQL> ed
Wrote file afiedt.buf

  1  create table foo (
  2    col1 number,
  3    col2 number generated always as (round(col1,2)) virtual
  4* )
SQL> /

Table created.

SQL> insert into foo( col1 ) values( 1.77665 );

1 row created.

SQL> select * from foo;

      COL1       COL2
---------- ----------
   1.77665       1.78

SQL> update foo set col2 = 2;
update foo set col2 = 2
       *
ERROR at line 1:
ORA-54017: UPDATE operation disallowed on virtual columns

不过,有趣的是,all_updatable_columns 错误地指示我可以更新虚拟列

SQL> ed
Wrote file afiedt.buf

  1  select column_name, updatable, insertable, deletable
  2    from all_updatable_columns
  3   where owner = 'SCOTT'
  4*    and table_name = 'FOO'
SQL> /

COLUMN_NAME                    UPD INS DEL
------------------------------ --- --- ---
COL1                           YES YES YES
COL2                           YES YES YES

如果我们将自己限制在 Oracle 10g(根据标记),我认为没有办法在表中定义无法更新的列。您可以将整个表放在只读表空间中,这将阻止您更新任何列。但我不希望这会反射(reflect)在 all_updatable_columns 中。

关于database - Oracle ALL_UPDATABLE_COLUMNS 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14588028/

相关文章:

database - Eclipse无法连接数据库

java - 安装 weblogic 12c 时的 InputHandlerException 和 DataHandlerException

oracle - 当我运行带有参数的查询或命令时,为什么 Dapper 会抛出 OracleException?

sql - 索引是否与 oracle 中的组功能一起使用?

database - 如何使用自己的位置数据库在网络应用程序中进行基于位置的搜索

mysql - 字典的数据库选择

mysql - 多用户访问MySQL返回新记录的连续计数器?

sql - Oracle SQL/PLSQL : Hierarchical recursive query with repeating data

sql - 大对象类型的奇怪行为

sql - ORA-19279 : XPTY0004 - XQuery dynamic type mismatch: expected singleton sequence on multiple rows with same name