ablog

不器用で落着きのない技術者のメモ

ADD COLUMN機能の拡張について

1.2.9.2 ADD COLUMN機能の拡張
列のデフォルト値は、NOT NULLと指定された列のデータ・ディクショナリに保持されます。
デフォルト値でNOT NULL制約付きの新規列を追加する場合に、すべての既存レコードにデフォルト値が保存されている必要はなくなりました。これにより、即時のスキーマ変更と既存のデータ・ボリュームからの独立が可能なだけでなく、領域も消費されません。

表の管理

ふむ。

$ sqlplus /nolog
SQL> conn scott/tiger
SQL> create table scott.test1 (col1 number);
SQL> alter table scott.test1 add (col2 char(3) default 'foo' not null);
SQL> alter session set events '10046 trace name context forever, level 12';
SQL> insert into scott.test1 (col1) values (1);
SQL> commit;
SQL> select * from scott.test1;

      COL1 COL2
---------- ---------
         1 foo
SQL> exit
$ cd /opt/oracle/diag/rdbms/orcl/orcl1/trace
$ ls -lt|head -5
$ view orcl1_ora_6701.trc
...
select binaryDefVal, length(binaryDefVal) from ecol$           where tabobj# = :1 and colnum = :2
$ view $ORACLE_HOME/rdbms/admin/dcore.bsq
...
REM This table is an extension to col$ and is used (for now) to store the
REM default value with which a column was added
create table ecol$
(
  tabobj#      number,
  colnum       number,
  binaryDefVal blob)
tablespace system
/
...
$ sqlplus /nolog
SQL> conn scott/tiger
SQL>select distinct o.object_id,
	o.object_name,
	c.column_name
from all_objects o, all_tab_cols c, ecol$ e
	where o.object_type = 'TABLE'
		and o.owner = c.owner
		and o.object_name = c.table_name
		and o.object_id = e.tabobj#
		and c.column_id = e.colnum;

OBJECT_ID OBJECT_NAME          COLUMN_NAME
--------- -------------------- --------------------
   101108 TEST1                COL2

ecol$ か。
テーブルを drop したのに ecol$ にエントリが残っている場合は、recyclebin にまだいる。