2012年2月15日水曜日

11gにおける一時表領域がSYSTEM表領域なユーザに関する考察#1

(今回はいつにも増して下らないネタ…)

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作ってやる!!!!

0 件のコメント:

コメントを投稿