Oracle『表領域とスキーマの作成』データベースを使う準備をする

Oracle『表領域とスキーマの作成』データベースを使う準備をする Oracle SQL入門

【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】

データを保存する領域を確保しよう

Oracle XEをインストールしたら、さあSQLを使ってデータを登録といきたいところですが、
インストールしてすぐにデータが登録できるわけではありません

テーブルやレコードを登録するにはその場所となる表領域やスキーマが必要になります。

日常に例えるなら、注文住宅として家を建てる前に、土地と住む人を用意するイメージです。

 土地

ということで、今回はそれらの作成方法について説明します。

表領域とスキーマについては以下で詳しく説明してるので、
もしまだイメージがつかないということであれば今から何を作成するのか理解してから実行しましょう。

データベースのインストール方法はこちらです。

表領域とスキーマの作成方法について

表領域とスキーマはOracleクライアントツールからSQLを使って作成します。

Oracleクライアントツールについては以下で説明しています。

表領域やスキーマを作成できるユーザーは限られていて、Oracleをインストールした際に作成される
「sys」「system」と呼ばれる管理者用のユーザーにその権限が与えられています

今回は「system」ユーザーを使って作成していきますので、
クライアントから「system」ユーザーでログインしてSQLを実行してください。

セッションの接続先を切り替える

セッションとは、Oracleデータベースとの接続状態や情報のことです。

パソコンからネットに繋げてWebサイトを見るのと同じようなイメージで、
Oracleからデータを取得する際に、セッションを確立してやり取りを行うわけです。

 クラウド

と、ここから本題ですが、

Oracleのバージョン12c以降から、マルチテナント・アーキテクチャという概念が入り、
CDBとPDBという2種類の領域でデータベースが構成
されるようになりました。

今回使う「system」ユーザーでログインすると、CDBへ接続するのですが、
私たちが表領域やスキーマを作成する場所はPDBの方になるので、

作成用のSQLを実行する前に、セッションの接続先をPDBへ切り替えておく必要があります。

ということで、セッションの接続先を切り替えるSQLは以下です。

ALTER SESSION SET CONTAINER = [PDB名]; 

Oracle XEをインストールした場合、PDBの名前は「XEPDB1」になるので、
実際に流すSQLはこのような感じになります。クライアントツールから実行しましょう!

ちなみに、SQLの最後には「;」セミコロンを付けるルールになっているので、
実行時に忘れないように注意しましょう。

ALTER SESSION SET CONTAINER = XEPDB1; 

他のバージョンをインストールしている人は、PDB名が違うので、
以下のSQLから、PDBの名前を調べてみてください。

SELECT NAME, OPEN_MODE FROM V$PDBS;

OPEN_MODE列に「READ WRITE」と表示されているPDBに接続しましょう。

また、バージョン11g以前には、マルチテナント・アーキテクチャの概念はないので、
セッションの接続先を切り替える必要はありません

お使いのバージョンにあわせて実行してください。

ちなみに、本ブログの記事を参照してインストールをした人は、
12c以降のDBになっているはずなので、上記SQLの実行が必要です。

表領域の作成(CREATE TABLESPACE)

表領域を作成する時は以下のSQLを実行します。

CREATE TABLESPACE [表領域名]
 DATAFILE '[ファイルパス]\[ファイル名].dbf' SIZE [ファイルサイズ];

「MYTBS01」という100M(メガ)のデータファイルを作成する場合はこんな感じです。

CREATE TABLESPACE MYTBS
 DATAFILE 'C:\app\oracle\productc\oradata\XE\MYTBS01.dbf' SIZE 100M;

ファイルパスを省略して、ファイル名だけで作成することもできます。
その場合、ファイルはOracleが指定する初期位置に作成されます。

また、表領域の作成SQLには他にもいろいろなオプションがあって、
さらに構文を追記して実行することで細かな設定ができますが、学習で使うのであればこのSQLで十分です。

実行できたら、データファイルが作成されているか以下のSQLで確認しましょう。
データファイルのパスもこれで確認できます。

SELECT * FROM DBA_DATA_FILES; 

現在のデータベース内に存在する表領域を確認するSQLは以下です。
指定した名前の表領域があるか確認しましょう。

SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;

ちなみに、表領域の作成=データファイルの作成となります。
それぞれの関係性については以下で説明しています。

スキーマの作成(CREATE USER)

スキーマを作成する時は以下のSQLを実行します。

CREATE USER [ユーザー名] IDENTIFIED BY [パスワード]
    DEFAULT TABLESPACE MYTBS TEMPORARY TABLESPACE TEMP; 

CREATE SCHEMAではなく、CREATE USERであることに注意してください。

Oracleでは、ユーザーを作成すると同時にスキーマが同じ名前で自動で作成されるようになっています。

「MYSCM」というユーザーをパスワード「pass12345」で作成するとこんな感じです。

CREATE USER MYSCM IDENTIFIED BY pass12345
    DEFAULT TABLESPACE MYTBS TEMPORARY TABLESPACE TEMP; 

作業が終わったら、以下のSQLでユーザー(スキーマ)が作成されているかどうか確認しましょう。

SELECT * FROM DBA_USERS ORDER BY USERNAME;

作成したユーザーに権限を与える(GRANT)

作成したばかりのユーザーですが、最初は何の権限も持っていません。

テーブルを作成したり、データを参照したり、データベースにアクセスすることすらできません。

ただOracleの情報としてユーザーが存在するというだけの状態です。

ということで、作成したユーザーで一通りの開発作業ができるように権限を与えましょう

ユーザーに権限を付与するには、GRANT文を使います。

GRANT [ロール名、または、権限名] TO [ユーザー名];

いろいろな権限をまとめた役割のようなものをOracleではロールと呼ぶのですが、
今回は「CONNECT」「RESOURCE」「DBA」の3つのロールを与えました。

また、開発の際によく使うビューと呼ばれるオブジェクトの作成権限が
上記のロールには入っていないので、追加で「CREATE VIEW」権限を付与しました。

GRANT CONNECT TO MYSCM; 

GRANT RESOURCE TO MYSCM; 

GRANT DBA TO MYSCM;

GRANT CREATE VIEW TO MYSCM;

各ロールでできることについてはこちらに説明がありますが、今の時点ですべて理解する必要は特にありません

実行できたら、ユーザーに付与されたロールや権限を以下のSQLで確認しましょう。

確認用のSQLでは、SQLを実行しているユーザーの情報が表示されるので、
先ほど作成したユーザーでログインしなおしてから実行しましょう。

-- 権限を確認するSQL
SELECT USERNAME, PRIVILEGE, ADMIN_OPTION FROM SYS.USER_SYS_PRIVS; 

-- ロールを確認するSQL
SELECT USERNAME, GRANTED_ROLE, ADMIN_OPTION FROM SYS.USER_ROLE_PRIVS;

表領域の削除(DROP TABLESPACE)

もし表領域を間違って作成してしまった場合は、以下のSQLでデータファイルごとまとめて削除できます。

DROP TABLESPACE [表領域名] INCLUDING CONTENTS AND DATAFILES;

削除できたら、先ほどの確認用SQLを実行して、
データファイルや表領域が消えていることをしっかり確認してから再作成をしましょう。

表領域とスキーマの作成 まとめ

表領域とスキーマの作成について以下説明しました。

  • 表領域とスキーマについて
  • セッションの接続先を切り替える方法
  • 表領域の作成(CREATE TABLESPACE)
  • スキーマの作成(CREATE USER)
  • ユーザーへの権限付与(GRANT)
  • 表領域の削除(DROP TABLESPACE)

すべて作成できたら、クライアントツールから作成したユーザーでログインできるか確認してみましょう!

もし「A5:SQL Mk-2」を使っていて、新規ユーザーでPDBへログインできない場合は、
直接接続にしてサービス名を「XEPDB1」として試してください。(XEPDB1はPDBの名前です。)

タイトルとURLをコピーしました