1

OracleシステムテーブルALL_UPDATABLE_COLUMNSの内容を理解したいと思います。ドキュメントには次のように書かれています

ALL_UPDATABLE_COLUMNSは、適切な権限を条件として、現在のユーザーが更新可能な結合ビューのすべての列を記述します。

結合ビューの一部の列を更新できないことは理解していますが、驚いたことに、このテーブルから選択すると、通常のテーブルとその列もここに一覧表示されます。通常のテーブルの特定の列が更新できない場合のシナリオはありますか?(テーブルレベルでの更新権限があると仮定します)

4

1 に答える 1

4

テーブルの列が更新できない場合があります。たとえば、仮想列を作成した場合(これは、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

于 2013-01-29T17:35:45.240 に答える