OracleDB - ユーザが作成できない

※注意)わからないなりにに経過に沿ってメモを取っているので間違ってる箇所あると思います。

やりたいこと

ユーザを作成していろいろ触りたかった。

はじまりは

OracleDBとsql developerをインストールした後の話です。
なんとなく、接続して、テーブル作成できたので、これで触っていこうかと思っていたのですが…

なんか…よくわからない…

インストール後にDBもユーザーも作っていないので、そこから始めようとおもい…

ただ、ユーザーを作成して、そのユーザーにテーブルを作成して、いろいろと動かしてみたかったんですけど…

ユーザーの作成すらできませんでした。

こんなところで躓きました…

まず、sqlplusを使ってログインした後の話になります

sqlplusでログイン

ユーザー:sys / as sysdba
password :なし

Microsoft Windows [Version 10.0.19044.2251]
(c) Microsoft Corporation. All rights reserved.

C:\Users\komor>sqlplus

SQL*Plus: Release 21.0.0.0.0 - Production on 日 124 17:34:24 2022
Version 21.3.0.0.0

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

ユーザー名を入力してください: sys / as sysdba
パスワードを入力してください:


Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL>

ログインは出来ます。

ユーザーの作成に失敗

次に、どこに作られるのかよくわからないが…ユーザーを作ろうととしました。

SQL> create user user1 identified by "password";
create user user1 identified by "password"
            *
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です

自分はユーザーすら作れない…取っ掛かりは難しいです。

<<ネットで検索>>

【エラー】
ORA-65096:共通ユーザーまたはロール名が無効です。
【原因】
Oracle 12c でコンテナ・データベースでCREATE USER を実行すると発生します。
コンテナ・データベースでローカルユーザーを作成することはできません。
【対応方法】
ローカルユーザーを作成する場合はプラガブル・データベースにログインして CREATE USER を実行します。

https://www.projectgroup.info/tips/Oracle/errorcode/ORA-65096.html

「プラガブル・データベース」が分からない…そもそも作った覚えがないし…うーん…でもなんか作った気もするな…

<<ネットで検索>>

どうもOracleXX以降はマルチテナントというものになったらしいです。今はデフォルトでインストールするとそういうことらしいです。

キーワードは
 ・コンテナ・データベース(CDB)
 ・プラガブル・データベース(PDB)

コンテナ・データベース(CDB)の中に複数のプラガブル・データベース(PDB)を持つイメージだそうです。

Oracleをさわっていて「PDB」ってキーワードも見たことあったのですが、プラガブル・データベースのことだと思っていませんでした。…いや…まだ意味わかってませんが…

環境を1から作ったことが無いため、このあたり理解できていないようです。

深く考えずにOracleDBをインストールしていたので…今どこにログインしているかすらわかっていません。

ログインしているデータベースを確認する

とりあえずログインできているので、今ログインしているのがCDBなのかPDBなのかを確認しました。

CDBにログインしているので、ここでユーザーが作れなかったということですね。

SQL> show con_name

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

ログインユーザーの確認

SQL> show user;
ユーザーは"SYS"です。

現在のPDBの確認

うーん…XEPDB1っていつ作ったっけ?…でも以前つくっようなきも…

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 XEPDB1                         READ WRITE NO
SQL> select name, open_mode from v$pdbs;

NAME
--------------------------------------------------------------------------------
OPEN_MODE
--------------------
PDB$SEED
READ ONLY

XEPDB1
READ WRITE

PDBにログインする

SQL> alter session set container=xepdb1;  

セッションが変更されました。

SQL> startup
プラガブル・データベースがオープンされました。

SQL> show con_name

CON_NAME
------------------------------
XEPDB1

【ペンディング】PDBにログイン出来ている…これをSQL Developerでログインするのはどうやるんだろう?

ユーザーの確認

// SQL> select * from ALL_USERS ORDER BY USERNAME;
SQL> select username from ALL_USERS ORDER BY USERNAME;

USERNAME
--------------------------------------------------------------------------------
USER1

ユーザーの作成

SQL> CREATE USER user1
  2  IDENTIFIED BY "password"
  3  DEFAULT TABLESPACE users
  4  TEMPORARY TABLESPACE temp;

ユーザーが作成されました。

SQL> SELECT * FROM ALL_USERS WHERE USERNAME='user1';

作成したユーザーの確認

ユーザー名は大文字になるのかな?

SQL> select username from ALL_USERS WHERE USERNAME='user1' ORDER BY USERNAME;

レコードが選択されませんでした。

SQL> select username from ALL_USERS WHERE USERNAME='USER1' ORDER BY USERNAME;

USERNAME
--------------------------------------------------------------------------------
USER1

権限の付与

DBA ロールの付与と表領域の使用量を無制限

SQL> GRANT DBA TO user1 ;

権限付与が成功しました。

SQL> GRANT UNLIMITED TABLESPACE TO user1 ;

権限付与が成功しました。

テーブルの作成

作成したユーザーに属するテーブルを作成
SQL Developerで見ると、「その他のユーザー」のツリーのしたの「USER1」にテーブルが作成されていました。

CREATE TABLE user1.emp 
 (
 empno VARCHAR2(10) NOT NULL,
 empname VARCHAR2(50),
 gender_f NUMBER(1,0)
 ) 

テーブルの削除

 drop table user1.emp
 /

ここまででわからない点

sqlPlusで「CDB」にログインして、「PDB」に切り替えてユーザー作成して、そのユーザーは以下にテーブル作成したけど…
「PDB」のセッションを開始?している状態では「作成したユーザー」は「その他のユーザー」に出てくる。
PDBに作成したユーザーログインしないといけないと思っていたのだけど…そういうことではないのか?

以下のサイトを見ると、自分のやったことは「共通ユーザー(sys)からのPDB接続」ということらしいです。

以下のサイトを見ると、PDBのユーザーで接続する方法が記載されていました。

以下のファイルを修正します。

C:\app\XXXXX\product\21c\homes\OraDB21Home1\network\admin\tnsnames.ora

tnsnames.ora」に以下の記述を追加しました。

XEPDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = MyComputer)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XEPDB1)
    )
  )

その後、特に再起動などしなくても以下のようにつながることができました。

>sqlplus USER1@XEPDB1

SQL*Plus: Release 21.0.0.0.0 - Production on 月 125 00:48:47 2022
Version 21.3.0.0.0

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

パスワードを入力してください:


Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL>

<<後日…なんとかしたい>>

もう一度、PDBの作成から

以下のサイトをみながらやってみます。

SQL> alter session set container=PDB$SEED;

セッションが変更されました。

SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
C:\APP\MYNAME\PRODUCT\21C\ORADATA\XE\PDBSEED\UNDOTBS01.DBF
C:\APP\MYNAME\PRODUCT\21C\ORADATA\XE\PDBSEED\SYSAUX01.DBF
C:\APP\MYNAME\PRODUCT\21C\ORADATA\XE\PDBSEED\SYSTEM01.DBF

SQL> conn /as sysdba
接続されました。


この記事が気に入ったらサポートをしてみませんか?