(今回はいつにも増して下らないネタ…) 11.2.0.3.0時代、あるところに、ユーザのデフォルト表領域がSYSTEM表領域で、 一時表領域もSYSTEM表領域のユーザがおったそうな。。 SYSTEM表領域が一時表領域なのはなんか怖い・・・? どうしてこんなユーザがいるんだろう?? どう作ったらこんなことになるのだろう?? やってみます。 ■環境 Windows7 64Bit Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64Bit まずは、素直にユーザ作成時にSYSTEM表領域を指定してユーザを作ってみます。 SQL> create user hoge2 identified by hoge2 2 default tablespace system temporary tablespace system; create user hoge2 identified by hoge2 * 行1でエラーが発生しました。: ORA-12911: 永続表領域は一時表領域に指定できません む。。 SQLリファレンスより、CREATE USER文のTABLESPACEに関係する部分を確認します。 ====================================================================== DEFAULT TABLESPACE句 ユーザーのスキーマ内に作成されるオブジェクトを格納する デフォルトの表領域を指定します。 この句を省略した場合、ユーザーのオブジェクトはデータベースの デフォルトの表領域に格納されます。 データベースのデフォルトの表領域が指定されていない場合、 ユーザーのオブジェクトはSYSTEM表領域に格納されます。 デフォルトの表領域の制限事項: ローカル管理の一時表領域(UNDO表領域を含む)またはディクショナリ管理の 一時表領域は、ユーザーのデフォルトの表領域として指定できません。 TEMPORARY TABLESPACE句 ユーザーの一時セグメントが確保される表領域または表領域グループを指定します この句を省略した場合、ユーザーの一時セグメントはデータベースの デフォルトの一時表領域に格納されます。 データベースのデフォルトの一時表領域が指定されていない場合は、 SYSTEM表領域に格納されます。 tablespaceに、ユーザーの一時セグメント表領域を指定します。 tablespace_group_nameを指定すると、ユーザーは、tablespace_group_nameで 指定された表領域グループ内の任意の表領域に一時セグメントを 保存できるようになります。 一時表領域の制限事項: この句には、次の制限事項があります。 表領域は一時表領域で、標準ブロック・サイズである必要があります。 表領域は、UNDO表領域または自動セグメント領域管理の表領域にできません。 ====================================================================== 表領域を指定しないでユーザを作ってみる。 ※この時点で既に現実的でない気もしなくはない。。 SQL> create user hoge identified by hoge; ユーザーが作成されました。 SQL>select username,default_tablespace,temporary_tablespace from dba_users 2 where username='HOGE' USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ---------- -------------------- -------------------- HOGE USERS TEMP むむ。 どうやら、データベースのデフォルトの表領域と デフォルトの一時表領域が指定されているようだ。 SQL> select property_value,property_name from database_properties 2 where property_name like '%TABLESPACE%'; PROPERTY_VALUE PROPERTY_NAME --------------- ------------------------------ TEMP DEFAULT_TEMP_TABLESPACE USERS DEFAULT_PERMANENT_TABLESPACE 強引に変えられないかなぁ SQL> alter user hoge default tablespace system; ユーザーが変更されました。 SQL> alter user hoge temporary tablespace system; ORA-12911: 永続表領域は一時表領域に指定できません SQL>select username,default_tablespace,temporary_tablespace from dba_users 2 where username='HOGE'; USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE ---------- -------------------- -------------------- HOGE SYSTEM TEMP むむむ。 じゃ、デフォルトの表領域を変えて、ユーザを新規に作ってみるか SQL> alter database DEFAULT TABLESPACE system データベースが変更されました。 SQL> alter database DEFAULT TEMPORARY TABLESPACE system 行1でエラーが発生しました。: ORA-12901: デフォルトの一時表領域はTEMPORARY型である必要があります。 むむむむ。 じゃ、デフォルトの一時表領域をNULLにしてみるか SQL> alter database DEFAULT TEMPORARY TABLESPACE ; alter database DEFAULT TEMPORARY TABLESPACE * 行1でエラーが発生しました。: ORA-02216: 表領域名が必要です。 SQL> alter database DEFAULT TEMPORARY TABLESPACE ''; alter database DEFAULT TEMPORARY TABLESPACE "" * 行1でエラーが発生しました。: ORA-01741: 長さゼロの識別子は無効です。 SQL> select property_value,property_name from database_properties 2 where property_name like '%TABLESPACE%'; PROPERTY_VALUE PROPERTY_NAME --------------- ------------------------------ TEMP DEFAULT_TEMP_TABLESPACE SYSTEM DEFAULT_PERMANENT_TABLESPACE むむむむむ。 NULLに出来ないなら、TEMP削除してやるっ SQL> drop tablespace temp; drop tablespace temp * 行1でエラーが発生しました。: ORA-12906: デフォルトの一時表領域は削除できません。 むむむむむむ。 こうなったら、USERSとTEMPがないDB作ってやる!!!!
2012年2月15日水曜日
11gにおける一時表領域がSYSTEM表領域なユーザに関する考察#1
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿