テーブルの列が更新できない場合があります。たとえば、仮想列を作成した場合(これは、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(タグごと)に制限する場合、更新できないテーブルの列を定義する方法はないと思います。テーブル全体を読み取り専用のテーブルスペースに配置すると、列を更新できなくなります。しかし、それがに反映されるとは思いませんall_updatable_columns
。