この記事は。
OracleDBの勉強中にユーザー作成とセッションの確立で知らなかった点を記載しています。
熟練のOracle使いからすれば小ネタにもならない点でしたが、備忘録です。
私の環境
- MacBook Pro (13-inch, Mid 2012) Mojave 10.14.5
- Oracle Database 12c
- Docker version 19.03.1
- DBearver(クライアント)
ローカルユーザーの作成場所/CDBとPDBについて
少し前にDockerにOracleDBを乗っけて勉強を始めました。
SYSユーザーで接続できることは確認していましたが、もちろん管理者権限でDBを触るwebアプリケーションなんてありません。ないよね?
なので一般ユーザーを作成しようとしたのですが、ここで早速躓きました。
[ORA-65096]??????
結論から言うと、12cからはそれまでと構成が変わり、コンテナデータベース(CDB)とプラガブルデータベース(PDB)に別れたが為に発生したエラーでした。
というのも、12cからOracleDBは「マルチテナントアーキテクチャ」を採用しています。
平たく言うと、このアーキテクチャではCDBの中に一つ以上のPDBが内包される構成になっており、複数のPDBはそれぞれ独立したデータベースを持てるようになっているそうです。
その上で、PDBが属するCDBに対してバックアップやアップグレードを行えるため、PDBの独立性を保ちながら管理コストの低減を図れるようになってるとのこと。
この点についてはこちらのブログやこちらの内容が理解し易かった為。参考させていただきました。
従って、アプリケーションから接続することを想定したユーザー = ローカルユーザーはPDB側に作ってあげないといけません。
で、先ほどユーザーを作成しようとした際の接続を確認してみると、
思いっきりCDBに接続していますね。
もちろん、共通のCDBユーザーを作る方法もありますが、これは今回想定しているユーザーではないです。
共通の管理ユーザーを作成する場合は以下の記事を参考にすると良さそう。
ユーザー作成と接続権付与
そうと分かれば以下のようにPDB側へ接続。
以下でユーザー作成、接続権限を付与。
/* ユーザー作成 */
CREATE USER "TestUser" --大文字小文字を反映させたい場合は""必要
IDENTIFIED BY "testpass"
DEFAULT TABLESPACE users -- デフォルトの表領域指定
TEMPORARY TABLESPACE temp; -- 一時表領域指定
/* 接続権限付与 */
GRANT CREATE SESSION TO "TestUser";
これでテスト接続できました。
補足とか
実際select文の書き方なんかを勉強する為には、テストデータを突っ込まないといけませんでした。
なので他に権限を色々付与していく必要がありますが、それはまた別の記事で紹介したいと思います。
また、私の場合環境を作る中でPDBが起動する状態になっていたので大丈夫でしたが、PDBの起動設定なども行わないといけない場合があるみたいです。
その辺りについてはこちらのサイトが大変参考になりました。ありがとうございます。
参考記事、サイト
Oracle Database 12c プラガブル・データベースについて
Oracle Database 12c データベースのマルチテナントを実現するOracle Multitenant
Oracleのユーザ名を小文字にするとダブルコーテーションが必要
PDBの自動起動