Oracle Databaseログイン方法

新人のHさんへ。1年目が終わりかけているのにDBにログインが出来なくてっていうのはちょっとね。

免責
土日に勢いで書いてるから間違ってるかも。雰囲気だけでもつかんで。

# ①事前準備。
```
# id tanaka
# useradd -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper tanaka
# id tanaka
# passwd tanaka
# su - oracle
$ sqlplus /nolog
SQL> conn / as sysdba
SQL> create user tanaka identified by tanaka;
SQL> grant connect to tanaka;
SQL> conn tanaka/tanaka
SQL show user
SQL> exit
$ su - tanaka
$ vi .bash_profile     # 修正内容は↓を確認。
$ cat .bash_profile
```
```
[root@localhost ~]# id tanaka
id: tanaka: no such user
[root@localhost ~]# useradd -G dba,asmdba,backupdba,dgdba,kmdba,racdba,oper tanaka
[root@localhost ~]# id tanaka
uid=9003(tanaka) gid=9004(tanaka) groups=9004(tanaka),2002(dba),2003(asmdba),2004(backupdba),2005(dgdba),2006(kmdba),2007(racdba),2008(oper)
[root@localhost ~]# passwd tanaka
ユーザー tanaka のパスワードを変更。
新しいパスワード:
よくないパスワード: このパスワードは 8 未満の文字列です。
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@localhost ~]#
[root@localhost ~]# su - oracle
最終ログイン: 2023/03/19 (日) 16:00:57 JST gatewayから開始日時 pts/1
[oracle@localhost ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on 日 3月 19 16:43:05 2023
Version 19.3.0.0.0

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

SQL> conn / as sysdba
接続されました。
SQL> create user tanaka identified by tanaka;

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

SQL> grant connect to tanaka;

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

SQL> conn tanaka/tanaka
接続されました。
SQL> show user
ユーザーは"TANAKA"です。
SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0との接続が切断されました。
[oracle@localhost ~]$ su - tanaka
パスワード:
最終ログイン: 2023/03/19 (日) 16:46:52 JST日時 pts/0
[tanaka@localhost ~]$ vi .bash_profile
[tanaka@localhost ~]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=${ORACLE_BASE}/product/19.3.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
export LD_PATH_LIBRARY=${LD_PATH_LIBRARY}:${ORACLE_HOME}/lib
umask 022

[tanaka@localhost ~]$
```

# ②コマンドの基本書式
```
基本書式(sqlplusから直接DBへ接続する場合)
$ sqlplus <ユーザ名>/<パスワード>@<Oracle Net接続識別子> (as sysdbaとか as sysoperとか)

基本書式(sqlplusでSQLコンソールに入り、connectでDBへ接続する場合)
$ sqlplus /nolog
SQL> CONNECT  <ユーザ名>/<パスワード>@<Oracle Net接続識別子> (as sysdbaとか as sysoperとか)
```

※CONNECTはCONNに省略可能
※sysでログインする際はas sysdbaの指定が必要(systemはいらない)
※OS認証とパスワード認証がある（③を参照）
※sqlplusにはSQLコンソールに入るが、DBに接続しない/nologオプションがある。（psやhistoryコマンドでパスワードが漏洩しないなどのメリット。最近のOracleではそもそも表示されなくなっているかもしれない）
※Oracle Databaseには外部クライアントから接続するときのために、受け口となるリスナープロセスがある。
　このリスナープロセス経由で接続することも可能。（ローカルからOracle Net接続識別子を指定することも可能）
※パスワード認証でパスワードを指定しないと、直後にパスワード入力を促すプロンプトが表示される。

# ③OS認証とパスワード認証の2種類がある。

OS認証
OSが認証したユーザにてログインする（Oracleの認証が不要となる）OUIをやったときに、事前に作成したOSグループ(dba,oper等)とOSDBAとかOSOPER等をマッピングさせたけど、あれ。
![WS000012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/eac5934c-047d-ae50-6e08-8d2e975987e6.jpeg)

マッピングしたOSグループに所属しているOSユーザは「<ユーザ名>/<パスワード>」ではなく、「/」でログインできる。
逆に言うと、所属させていないグループ(権限)ではログインできない。今回は試していないけど。
例：tanakaユーザをoperに所属させない場合、sysoperでログインできない。
パスワード認証
Oracleの認証にてログインする。create userするときに指定した名前とパスワードを使うやつ。

【OS認証】
```
$ sqlplus /nolog
SQL> conn / as sysdba
SQL show user
SQL> conn / as sysbackup
SQL show user
SQL> conn / as syskm
SQL> show user
```

```
[tanaka@localhost ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on 日 3月 19 16:56:17 2023
Version 19.3.0.0.0

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

SQL> conn / as sysdba
接続されました。
SQL> show user
ユーザーは"SYS"です。
SQL> conn / as sysbackup
接続されました。
SQL> show user
ユーザーは"SYSBACKUP"です。
SQL> conn / as syskm
接続されました。
SQL> show user
ユーザーは"SYSKM"です。
SQL>
```

【パスワード認証】
```
$ sqlplus /nolog
SQL> conn tanaka/tanaka
SQL> show user
```

```
[tanaka@localhost ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on 日 3月 19 17:00:28 2023
Version 19.3.0.0.0

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

SQL> conn tanaka/tanaka
接続されました。
SQL> show user
ユーザーは"TANAKA"です。
SQL>
```

# ④リスナー経由での接続
外部のクライアントから接続する際には受け口が必要。それがリスナープロセス。
外部から繋ぐため、IPアドレスとかポート番号とかが必要。
例えば以下。
```
sqlplus username/password@hostname:port/service_name
```

```
[tanaka@localhost ~]$ sqlplus tanaka/tanaka@localhost:1521/orcl

SQL*Plus: Release 19.0.0.0.0 - Production on 日 3月 19 17:07:40 2023
Version 19.3.0.0.0

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

最終正常ログイン時間: 日 3月  19 2023 17:00:38 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL>
```

※外部からとか言ったけど、↑みたいに別にローカルからリスナーを経由することも可能。

また、↑は簡易接続と呼ばれるやつで、IPアドレスとかポート番号を設定ファイルにまとめておくことも可能。
それがtnsnames.ora。

```
$ cd /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/
$ cat tnsnames.ora | grep -A 8 "^ORCL ="
$ sqlplus tanaka/tanaka@orcl
```

```
[oracle@localhost ~]$ cd /u01/app/oracle/product/19.3.0/dbhome_1/network/admin/
[oracle@localhost admin]$
[oracle@localhost admin]$ cat tnsnames.ora | grep -A 8 "^ORCL ="
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

[oracle@localhost admin]$ sqlplus tanaka/tanaka@orcl

SQL*Plus: Release 19.0.0.0.0 - Production on 日 3月 19 17:10:50 2023
Version 19.3.0.0.0

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

最終正常ログイン時間: 日 3月  19 2023 17:07:40 +09:00


Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
に接続されました。
SQL>
```