【Oracle DB基本2】表領域とスキーマーを作成する

# はじめに
[前回](https://qiita.com/dingtianhongjie/items/7d7628f199e306a72ff6)Oracle CloudのBase DBに接続できましたので、データを登録するための事前準備として、表領域とスキーマーを作成します。

# 表領域の作成
OSにSSHでログインし、oracleユーザからSQL*Plusで接続します。

```
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 18 10:24:55 2023
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.19.0.0.0
```

## PDBの確認と接続

Oracle DBは、マルチテナントアーキテクチャを採用しており、CDBとPDBがあります。
ざっくり言うと、CDBはPDBを管理するための領域、PDBはユーザデータを保存する領域です。

https://docs.oracle.com/cd/F19136_01/multi/introduction-to-the-multitenant-architecture.html#GUID-C5B0AF7D-ABE8-4F69-9552-F4DAF40281F1

デフォルトのCDBとPDBを確認します。

```
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 DB0714_PDB1                    READ WRITE NO
```

今はCDBに接続されていて、書き込み可能なPDBとして`DB0714_PDB1`があります。

表領域やスキーマーはPDBに作成しますので、PDBに接続します。

```
SQL> alter session set container = DB0714_PDB1 ;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
DB0714_PDB1
```

## 表領域の確認と作成

デフォルトで作成されている表領域を確認します。

```
SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
```

作成されている表領域とData Fileを確認します。

```
SQL> set lin 120
SQL> col TABLESPACE_NAME for a20
SQL> col FILE_NAME for a80
SQL> select tablespace_name,file_name,bytes/1024/1024 MB from dba_data_files;

TABLESPACE_NAME      FILE_NAME                                                                                MB
-------------------- -------------------------------------------------------------------------------- ----------
SYSAUX               +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/sysaux.271.114217        420
                     0831

UNDOTBS1             +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/undotbs1.270.1142         70
                     170841

SYSTEM               +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/system.273.114217        420
                     0819

USERS                +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/users.274.1142170          5
                     995
```

表領域を作成します。今回のBase DBはASMで構成されています。

https://docs.oracle.com/cd/E57425_01/121/OSTMG/GUID-47E5C33B-17E0-4CDC-82AE-D0107269A1BA.htm

名称`SHIBUYA`、容量`100MB`の表領域をASM領域に作成します。

```
SQL> create tablespace SHIBUYA datafile '+DATA' size 100m ;

Tablespace created.

SQL> select tablespace_name,file_name,bytes/1024/1024 MB from dba_data_files;

TABLESPACE_NAME      FILE_NAME                                                                                MB
-------------------- -------------------------------------------------------------------------------- ----------
SYSAUX               +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/sysaux.271.114217        420
                     0831

UNDOTBS1             +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/undotbs1.270.1142         70
                     170841

SYSTEM               +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/system.273.114217        420
                     0819

USERS                +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/users.274.1142170          5
                     995

TABLESPACE_NAME      FILE_NAME                                                                                MB
-------------------- -------------------------------------------------------------------------------- ----------

SHIBUYA              +DATA/DB0714_8SM_KIX/006C0A4610BB0447E0637C00000A3A75/DATAFILE/shibuya.281.11425        100
                     14633
```

# スキーマーの作成
ユーザとスキーマーは厳密には違うものですが、「同じものと捉えてもよい」という記載もあったりします。
ユーザを作成すると、同じ名称のスキーマーが作成されるので、ここでは深く考えずに`ユーザ ≒ スキーマー`くらいの認識でいこうと思います。

## スキーマーの作成
スキーマーの作成と言いつつ、コマンドが`create user`ですからね。
ここでは、ユーザ名`ken`、デフォルト表領域`SHIBUYA`でスキーマーを作成します。

```
SQL> create user ken identified by <パスワード> default tablespace SHIBUYA temporary tablespace temp;
```

確認します。
（grepできたらいいんですけど、SQLで同じようなことをする書き方がわからない）

```
SQL> select username from dba_users;

USERNAME
--------------------------------------------------------------------------------------------------------------------------------
SYS
SYSTEM
XS$NULL
LBACSYS
OUTLN
DBSNMP
APPQOSSYS
DBSFWUSER
GGSYS
ANONYMOUS
CTXSYS

USERNAME
--------------------------------------------------------------------------------------------------------------------------------
DVSYS
DVF
GSMADMIN_INTERNAL
OLAPSYS
MDSYS
XDB
WMSYS
GSMCATUSER
MDDATA
SYSBACKUP
REMOTE_SCHEDULER_AGENT

USERNAME
--------------------------------------------------------------------------------------------------------------------------------
GSMUSER
SYSRAC
OJVMSYS
SI_INFORMTN_SCHEMA
PDBUSER
AUDSYS
DIP
ORDPLUGINS
SYSKM
ORDDATA
ORACLE_OCM

USERNAME
--------------------------------------------------------------------------------------------------------------------------------
SYS$UMF
SYSDG
ORDSYS
KEN

37 rows selected.
```

## 権限の設定
作成したユーザに以下マニュアルにある3つの事前定義ロールを付与します。

https://docs.oracle.com/cd/F19136_01/admqs/administering-user-accounts-and-security.html#GUID-289A4BF6-F703-4ED5-8357-89F651A6D1DE

```
SQL> grant connect to ken;

Grant succeeded.

SQL> grant resource to ken;

Grant succeeded.

SQL> grant dba to ken;

Grant succeeded.
```

## 接続
一旦ログアウトして、作成したスキーマーに接続します。書式は以下です。
`$ sqlplus <スキーマ名>/<パスワード>@<ホスト名>:<ポート>/<サービス名>`

`@`以降はOCIコンソールの`PDB接続`から確認できます。

![スクリーンショット 2023-07-18 14.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/90c679cf-ac7c-011e-2a20-2ecd084f4a98.png)

```
$ sqlplus ken/<パスワード>@aoyama.public.ｘｘｘvcn01.oraclevcn.com:1521/DB0714_pdb1.public.ｘｘｘvcn01.oraclevcn.com
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 18 14:26:24 2023
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> show user
USER is "KEN"
SQL> show con_name

CON_NAME
------------------------------
DB0714_PDB1
```

### tnsnames.ora
`tnsnames.ora`ファイルに接続の情報を記載しておくことで、接続コマンドを簡略化できます。

```
$ cd $ORACLE_HOME/network/admin 
$ ls
samples  shrept.lst  sqlnet.ora  tnsnames.ora
```

```tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_DB0714 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = aoyama)(PORT = 1521))


DB0714_8SM_KIX =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = aoyama)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = DB0714_xxx_kix.public.oskvcn01.oraclevcn.com)
    )
  )

## 追記
PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = aoyama)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db0714_pdb1.public.xxxvcn01.oraclevcn.com)
    )
  )
## ここまで
```

```
$ sqlplus ken/<パスワード>@PDB1

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 18 14:46:00 2023
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Tue Jul 18 2023 14:26:25 +09:00

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> show user
USER is "KEN"
```