2.9.ていうかsqlplusが文字化け
[oracle@centos7_3 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jul 7 22:57:40 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
????????? ←ここ
SQL>
↓このサイトを猿真似
[oracle@centos7_3 ~]$ export NLS_LANG=Japanese_Japan.AL32UTF8
[oracle@centos7_3 ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 木 7月 7 23:01:54 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。 ←なおったダニ
SQL>
oracleユーザの.bashrcに書いとくダニ
[oracle@centos7_3 ~]$ echo "export NLS_LANG=Japanese_Japan.AL32UTF8" >> ~/.bashrc
[oracle@centos7_3 ~]$ tail -2 ~/.bashrc
export PATH=$PATH:$ORACLE_HOME/bin
export NLS_LANG=Japanese_Japan.AL32UTF8
3.DDL
■やること
3-1.ユーザ作成
3-2.ユーザ権限変更
3-3.データベース作成
3-4.インスタンス作成
3-5.スキーマ作成
3-6.プロファイル作成
3-1.ユーザ作成
下記の条件でユーザを作成する
・プロファイル:C##HOGE01
・デフォルト表領域:USERS
・一時表領域:TEMP
・ユーザ名:HOGEORA01
・パスワード:P@ssw0rd
①「C##HOGE01」プロファイルの作成
SQL> CREATE PROFILE C##HOGE01 LIMIT
2 SESSIONS_PER_USER UNLIMITED
3 CONNECT_TIME 60
4 IDLE_TIME 60
5 CPU_PER_SESSION DEFAULT
6 CPU_PER_CALL DEFAULT
7 LOGICAL_READS_PER_SESSION DEFAULT
8 LOGICAL_READS_PER_CALL DEFAULT
9 PRIVATE_SGA DEFAULT
10 COMPOSITE_LIMIT DEFAULT;
プロファイルが作成されました。
→プロファイルが作成された臭い。
①「C##HOGE」プロファイルの「DEFAULT,PASSWORD_LIFE_TIME」の確認
SQL> select profile || ',' || resource_name || ',' || limit from dba_profiles where profile = 'C##HOGE01' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE||','||RESOURCE_NAME||','||LIMIT
--------------------------------------------------------------------------------
C##HOGE01,PASSWORD_LIFE_TIME,DEFAULT
②ユーザ作成前
SQL> SELECT USERNAME FROM ALL_USERS WHERE USERNAME = 'HOGEORA01';
レコードが選択されませんでした。
→「HOGEORA01」ユーザはまだ居ない。
③ユーザ作成
SQL> CREATE USER HOGEORA01 IDENTIFIED BY "P@ssw0rd" DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE C##HOGE01;
CREATE USER HOGEORA01 IDENTIFIED BY "P@ssw0rd" DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE C##HOGE01
*
行1でエラーが発生しました。:
ORA-65096: 共通ユーザーまたはロール名が無効です
→「HOGEORA01」に難癖付けられた
エラーコードORA-65096をググったら、下記のような記事を見つけた。
上記を読むと、Oracle12c以降が備えるマルチテナント・アーキテクチャの仕組みを理解する必要があるらしい。
Oracle11gまでは、1つのインスタンスには1つのデータベースしかなかったけど、Oracle12cからは1つのインスタンスには1つのコンテナ・データベース(CDB)と、その下にプラガブル・データベース(PDB)と呼ばれる子DB(複数作成可能)が存在するかたちになるとのこと。(複雑やんけ)
11gまでと同様にOracleに接続した場合は、コンテナ・データベース(CDB)に接続されるが、CDBではユーザスキーマ(ローカルユーザー)を作成することができないとのこと。( ORA-65096 のエラーになるらしい)。ローカルユーザーは、実際にデータを管理するプラガブル・データベース(PDB)に接続して作成する必要があるとのこと。
※ローカル・ユーザーとは、特定のPDBのみに存在するユーザーのことで、共通ユーザーとは、各コンテナ(ルートと各PDB)に同名のユーザーが存在する場合のことで、ユーザー名に接頭辞(C##)が必要になるらしい。
そんで上記サイトでは、まず現在接続しているデータベースを確認白と書かれている。
SQL*Plus上で、show con_name を実行するらしい。
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
→CDBやんけ
プラガブル・データベース(PDB)に接続し直すために、まず、PDBの名前と現在のOPEN_MODEを確認しろとのこと。
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;
NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
PDB$SEED
READ ONLY
ORCLPDB1
MOUNTED
→ORCLPDB1がMOUNTEDになってるダニ。
PDBのOPEN_MODEが「MOUNTED」の状態では、まだPDBが起動していない状態のため、以下のようにしてPDBを起動する必要があるとのこと。
SQL> alter pluggable database ORCLPDB1 open;
プラガブル・データベースが変更されました。
※PDBを停止する場合は、以下のようにするとのこと。
SQL> alter pluggable database ORCLPDB1 close immediate;
プラガブル・データベースが変更されました。
とりあえずPDBを起動してPDBのOPEN_MODEを確認するダニ。
SQL> alter pluggable database ORCLPDB1 open;
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;
NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
PDB$SEED
READ ONLY
ORCLPDB1
READ WRITE ←ここが「READ WRITE」だったら、PDBは起動中でPDBに接続できるらしいダニ。
PDBへの接続は下記とのこと。
SQL> alter session set container = ORCLPDB1;
セッションが変更されました。
再度、現在接続しているデータベースを確認するダニ。
SQL> SHOW CON_NAME
CON_NAME
------------------------------
ORCLPDB1
→とりあえずPDBにつながったみたいダニ。
PDBに接続した状態でもう一度ユーザーを作成してみるダニ。
SQL> CREATE USER HOGEORA01 IDENTIFIED BY "P@ssw0rd" DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE C##HOGE01;
ユーザーが作成されました。 ←ユーザが作成された臭い!
確認するダニ。
SQL> SELECT USERNAME FROM ALL_USERS WHERE USERNAME = 'HOGEORA01';
USERNAME
--------------------------------------------------------------------------------
HOGEORA01
ユーザが作られたあああああああ><
SQL> SELECT * FROM ALL_USERS WHERE USERNAME = 'HOGEORA01';
USERNAME
--------------------------------------------------------------------------------
USER_ID CREATED COM O INH
---------- -------- --- - ---
DEFAULT_COLLATION
--------------------------------------------------------------------------------
IMP ALL
--- ---
HOGEORA01
106 22-07-08 NO N NO
USING_NLS_COMP
NO NO
ログインできるかな?
[oracle@centos7_3 ~]$ sqlplus HOGEORA01/P@ssw0rd
SQL*Plus: Release 19.0.0.0.0 - Production on 金 7月 8 00:17:06 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
ユーザー名を入力してください:
→接続できない><
3-2.ユーザ権限変更
作成したHOGEORA01ユーザに、「CREATE SESSION」権限と、「SELECT ANY DICTIONARY」権限を付与するダニ。
[oracle@centos7_3 ~]$ sqlplus / as sysdba
---(略)---
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
CDBのままでGRANT文使ってHOGEORA01ユーザに権限付与できるかやってみる。
まず、権限付与する前の確認。
SQL> SELECT GRANTEE || ',' || PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE ='HOGEORA01';
レコードが選択されませんでした。
ちなみにCDBにHOGEORA01ユーザってそもそもいないよね?
SQL> SELECT USERNAME FROM ALL_USERS WHERE USERNAME = 'HOGEORA01';
レコードが選択されませんでした。
なので、HOGEORA01ユーザに権限付与するとかは全部PDBに接続するのが前提。
SQL> SELECT NAME, OPEN_MODE FROM V$PDBS;
NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
ORCLPDB1
READ WRITE ←ここを見る。
SQL> alter session set container = ORCLPDB1;
セッションが変更されました。
SQL> SELECT USERNAME FROM ALL_USERS WHERE USERNAME = 'HOGEORA01';
USERNAME
--------------------------------------------------------------------------------
HOGEORA01
もう一度権限を確認。
SQL> SELECT GRANTEE || ',' || PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE ='HOGEORA01';
レコードが選択されませんでした。
→権限はない。(当然だけど)
権限を付与する。
SQL> GRANT CREATE SESSION,SELECT ANY DICTIONARY to HOGEORA01;
権限付与が成功しました。
→なんかできた臭い。
もう一度権限を確認。
SQL> SELECT GRANTEE || ',' || PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE ='HOGEORA01';
GRANTEE||','||PRIVILEGE
--------------------------------------------------
HOGEORA01,SELECT ANY DICTIONARY
HOGEORA01,CREATE SESSION
→なんか権限が付与された臭い。
もう一度sqlplusでログインできるか試してみる。
[oracle@centos7_3 ~]$ sqlplus HOGEORA01/P@ssw0rd
SQL*Plus: Release 19.0.0.0.0 - Production on 金 7月 8 00:39:23 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
→だめだw
もういちどsysでログインしてPDBに接続してHOGEORA01にconnect, resourceロールを与えてみる。(上記サイトの猿真似)
SQL> grant connect, resource to HOGEORA01;
権限付与が成功しました。
もう一回sqlplusでHOGEORA01ユーザがログインできるか試す。
[oracle@centos7_3 ~]$ sqlplus HOGEORA01/P@ssw0rd
----(略)----
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
だめやんw
接続先にPDBを指定しなくちゃいけないみたい
[oracle@centos7_3 ~]$ sqlplus HOGEORA01/P@ssw0rd@ORCLPDB1
----(略)----
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
もしかして「P@ssw0rd」の「@」が紛らわしい?
パスワードロック?
もう一人別のユーザをつくる。
(PDBへの接続までは省略)
SQL> CREATE USER HOGEORA02 IDENTIFIED BY "Passw0rd" DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT;
ユーザーが作成されました。
SQL> grant connect, resource to HOGEORA02;
権限付与が成功しました。
[oracle@centos7_3 ~]$ sqlplus HOGEORA02/Passw0rd@ORCLPDB1
SQL*Plus: Release 19.0.0.0.0 - Production on 金 7月 8 01:07:27 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-12154: TNS: 指定された接続識別子を解決できませんでした
→意味不明
3-3.データベース作成
3-4.インスタンス作成
3-5.スキーマ作成
3-6.プロファイル作成
4.DML
■やること
4-1.簡単なDML(insert、select、update、delete)のテスト