我想了解Oracle系统表ALL_UPDATABLE_COLUMNS的内容。文件说_
ALL_UPDATABLE_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
但有趣的是,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
.