Database Oracle所有可更新的列内容

Database Oracle所有可更新的列内容,database,oracle,oracle11g,oracle10g,Database,Oracle,Oracle11g,Oracle10g,我想了解Oracle系统表所有可更新列的内容。报告说 ALL_Updateable_COLUMNS描述联接视图中可由当前用户根据适当权限进行更新的所有列 我知道联接视图中的某些列是如何无法更新的,但从这个表中选择时,我惊奇地发现,这里也列出了常规表及其列。是否存在常规表的特定列不可更新的情况?(假设我拥有表级别的更新权限)在某些情况下,表的列是不可更新的。例如,如果我创建了一个虚拟列(虽然这只在11.1中提供),我就无法更新该列中的数据 SQL> ed Wrote file afiedt.

我想了解Oracle系统表所有可更新列的内容。报告说

ALL_Updateable_COLUMNS描述联接视图中可由当前用户根据适当权限进行更新的所有列


我知道联接视图中的某些列是如何无法更新的,但从这个表中选择时,我惊奇地发现,这里也列出了常规表及其列。是否存在常规表的特定列不可更新的情况?(假设我拥有表级别的更新权限)

在某些情况下,表的列是不可更新的。例如,如果我创建了一个虚拟列(虽然这只在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
有趣的是,
所有可更新的列
错误地指示我可以更新虚拟列

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(根据标签),我认为没有办法在表中定义无法更新的列。您可以将整个表放在只读表空间中,这将阻止您更新任何列。但我不希望这反映在
所有可更新的列中

在某些情况下,表的列是不可更新的。例如,如果我创建了一个虚拟列(虽然这只在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
有趣的是,
所有可更新的列
错误地指示我可以更新虚拟列

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(根据标签),我认为没有办法在表中定义无法更新的列。您可以将整个表放在只读表空间中,这将阻止您更新任何列。但我不希望这反映在
所有可更新列中

非常感谢,+1,如果一天内没有更好的答案(Oracle 10g不可更新列),我会接受。非常感谢,+1,如果一天内没有更好的答案(Oracle 10g不可更新列),我接受这个。