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 日 12月 4 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: 共通ユーザーまたはロール名が無効です
自分はユーザーすら作れない…取っ掛かりは難しいです。
<<ネットで検索>>
「プラガブル・データベース」が分からない…そもそも作った覚えがないし…うーん…でもなんか作った気もするな…
<<ネットで検索>>
どうも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 月 12月 5 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
接続されました。