【初心者向け】_【スーパーユーザ理解_第二回】oracle sysユーザについて

[第一回](https://qiita.com/awa-tomo/items/86feaad9d06a282be95c)では、oracleのDBAロールについて説明した。

今回の内容は、oracleの中でスーパーユーザと呼ばれている
**sys**ユーザについて
を説明していく。

# 目次
1. sysユーザとは
1. sysdba権限について
1. 類似するsystemユーザについて
1. まとめ


# 1. sysユーザとは
Oracleでのsysユーザとは、データベースの最高管理者である。
→何でもできるユーザである。
(sysユーザは、Linuxでいうところのrootユーザに近い。)


rootユーザは、すべてのオブジェクトにアクセスできるDBAロールが付与されている。
[第一回](https://qiita.com/awa-tomo/items/86feaad9d06a282be95c)参照

ちなみに、SYSユーザに与えられている各種ロールは以下の通りである。

```SQL
  1  select GRANTEE,GRANTED_ROLE from dba_ROLE_PRIVS
  2  where GRANTEE='SYS'
  3* order by 2

GRANTEE                        GRANTED_ROLE
------------------------------ ------------------------------
SYS                            ADM_PARALLEL_EXECUTE_TASK
SYS                            APPLICATION_TRACE_VIEWER
SYS                            AQ_ADMINISTRATOR_ROLE
SYS                            AQ_USER_ROLE
SYS                            AUDIT_ADMIN
SYS                            AUDIT_VIEWER
SYS                            AUTHENTICATEDUSER
SYS                            BDSQL_ADMIN
SYS                            BDSQL_USER
SYS                            CAPTURE_ADMIN
SYS                            CDB_DBA
SYS                            CONNECT
SYS                            DATAPATCH_ROLE
SYS                            DATAPUMP_EXP_FULL_DATABASE
SYS                            DATAPUMP_IMP_FULL_DATABASE
SYS                            DBA
SYS                            DBFS_ROLE
SYS                            DBMS_MDX_INTERNAL
SYS                            EM_EXPRESS_ALL
SYS                            EM_EXPRESS_BASIC
SYS                            EXECUTE_CATALOG_ROLE
SYS                            EXP_FULL_DATABASE
SYS                            GATHER_SYSTEM_STATISTICS
SYS                            GDS_CATALOG_SELECT
SYS                            GGSYS_ROLE
SYS                            GSMADMIN_ROLE
SYS                            GSMROOTUSER_ROLE
SYS                            GSMUSER_ROLE
SYS                            GSM_POOLADMIN_ROLE
SYS                            HS_ADMIN_EXECUTE_ROLE
SYS                            HS_ADMIN_ROLE
SYS                            HS_ADMIN_SELECT_ROLE
SYS                            IMP_FULL_DATABASE
SYS                            LOGSTDBY_ADMINISTRATOR
SYS                            OEM_ADVISOR
SYS                            OEM_MONITOR
SYS                            OPTIMIZER_PROCESSING_RATE
SYS                            PDB_DBA
SYS                            PROVISIONER
SYS                            RECOVERY_CATALOG_OWNER
SYS                            RECOVERY_CATALOG_OWNER_VPD
SYS                            RECOVERY_CATALOG_USER
SYS                            RESOURCE
SYS                            SCHEDULER_ADMIN
SYS                            SELECT_CATALOG_ROLE
SYS                            SODA_APP
SYS                            SYSUMF_ROLE
SYS                            XDBADMIN
SYS                            XDB_SET_INVOKER
SYS                            XDB_WEBSERVICES
SYS                            XDB_WEBSERVICES_OVER_HTTP
SYS                            XDB_WEBSERVICES_WITH_PUBLIC
SYS                            XS_CACHE_ADMIN
SYS                            XS_CONNECT
SYS                            XS_NAMESPACE_ADMIN
SYS                            XS_SESSION_ADMIN

56行が選択されました。

```

DBAロールがあることも確認できるかと思う。
その他にも、oracleインストール時に、作成されるロールのほとんどが、付与されていることがわかる。
詳しく確認したい方は、以下のトグルを開いて確認してほしい。


<details>
<summary>oracle自動作成ロールとSYSユーザの関係</summary>

※```ORACLE_MAINTAINED＝Y``` ロールが、oracleインストール時にoracleが内部的に作成するロールである。

```SQL
SQL> select DR.ROLE,
  2  case
  3  when sys.GRANTED_ROLE is not null then 'SYSユーザに付与されている'
  4  else '付与されていない'
  5  end
  6  ,ORACLE_MAINTAINED
  7  from DBA_ROLES DR
  8  left join  (select GRANTEE,GRANTED_ROLE from dba_ROLE_PRIVS where GRANTEE='SYS') SYS
  9  on sys.GRANTED_ROLE=DR.ROLE
 10  where ORACLE_MAINTAINED='Y'
 11  order by 1;

ROLE                           CASEWHENSYS.GRANTED_ROLEISNOTNULLTHE O
------------------------------ ------------------------------------ -
ADM_PARALLEL_EXECUTE_TASK      SYSユーザに付与されている            Y
APPLICATION_TRACE_VIEWER       SYSユーザに付与されている            Y
AQ_ADMINISTRATOR_ROLE          SYSユーザに付与されている            Y
AQ_USER_ROLE                   SYSユーザに付与されている            Y
AUDIT_ADMIN                    SYSユーザに付与されている            Y
AUDIT_VIEWER                   SYSユーザに付与されている            Y
AUTHENTICATEDUSER              SYSユーザに付与されている            Y
BDSQL_ADMIN                    SYSユーザに付与されている            Y
BDSQL_USER                     SYSユーザに付与されている            Y
CAPTURE_ADMIN                  SYSユーザに付与されている            Y
CDB_DBA                        SYSユーザに付与されている            Y
CONNECT                        SYSユーザに付与されている            Y
DATAPATCH_ROLE                 SYSユーザに付与されている            Y
DATAPUMP_EXP_FULL_DATABASE     SYSユーザに付与されている            Y
DATAPUMP_IMP_FULL_DATABASE     SYSユーザに付与されている            Y
DBA                            SYSユーザに付与されている            Y
DBFS_ROLE                      SYSユーザに付与されている            Y
DBMS_MDX_INTERNAL              SYSユーザに付与されている            Y
EM_EXPRESS_ALL                 SYSユーザに付与されている            Y
EM_EXPRESS_BASIC               SYSユーザに付与されている            Y
EXECUTE_CATALOG_ROLE           SYSユーザに付与されている            Y
EXP_FULL_DATABASE              SYSユーザに付与されている            Y
GATHER_SYSTEM_STATISTICS       SYSユーザに付与されている            Y
GDS_CATALOG_SELECT             SYSユーザに付与されている            Y
GGSYS_ROLE                     SYSユーザに付与されている            Y
GLOBAL_AQ_USER_ROLE            付与されていない                     Y
GSMADMIN_ROLE                  SYSユーザに付与されている            Y
GSMROOTUSER_ROLE               SYSユーザに付与されている            Y
GSMUSER_ROLE                   SYSユーザに付与されている            Y
GSM_POOLADMIN_ROLE             SYSユーザに付与されている            Y
HS_ADMIN_EXECUTE_ROLE          SYSユーザに付与されている            Y
HS_ADMIN_ROLE                  SYSユーザに付与されている            Y
HS_ADMIN_SELECT_ROLE           SYSユーザに付与されている            Y
IMP_FULL_DATABASE              SYSユーザに付与されている            Y
LOGSTDBY_ADMINISTRATOR         SYSユーザに付与されている            Y
OEM_ADVISOR                    SYSユーザに付与されている            Y
OEM_MONITOR                    SYSユーザに付与されている            Y
OPTIMIZER_PROCESSING_RATE      SYSユーザに付与されている            Y
PDB_DBA                        SYSユーザに付与されている            Y
PROVISIONER                    SYSユーザに付与されている            Y
RECOVERY_CATALOG_OWNER         SYSユーザに付与されている            Y
RECOVERY_CATALOG_OWNER_VPD     SYSユーザに付与されている            Y
RECOVERY_CATALOG_USER          SYSユーザに付与されている            Y
RESOURCE                       SYSユーザに付与されている            Y
SCHEDULER_ADMIN                SYSユーザに付与されている            Y
SELECT_CATALOG_ROLE            SYSユーザに付与されている            Y
SODA_APP                       SYSユーザに付与されている            Y
SYSUMF_ROLE                    SYSユーザに付与されている            Y
WM_ADMIN_ROLE                  付与されていない                     Y
XDBADMIN                       SYSユーザに付与されている            Y
XDB_SET_INVOKER                SYSユーザに付与されている            Y
XDB_WEBSERVICES                SYSユーザに付与されている            Y
XDB_WEBSERVICES_OVER_HTTP      SYSユーザに付与されている            Y
XDB_WEBSERVICES_WITH_PUBLIC    SYSユーザに付与されている            Y
XS_CACHE_ADMIN                 SYSユーザに付与されている            Y
XS_CONNECT                     SYSユーザに付与されている            Y
XS_NAMESPACE_ADMIN             SYSユーザに付与されている            Y
XS_SESSION_ADMIN               SYSユーザに付与されている            Y

58行が選択されました。
```


</details>

このことから、SYSユーザは、oracleが自動作成するすべてのロールを持っており、極めて強い権限を持っていることがわかる。
それに加えて、sysdba権限という、権限の中で異質かつ最強の権限も保持している。

# 2. sysdba権限について
今まで触れてきたロールや権限は、あくまでもオブジェクトに対する権限である
ということである。
それに対して、sysdba権限はDBの全体管理に関わる権限である
イメージ図を下記に示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/c6e8367e-70eb-1059-5da9-6e601c9eb60c.png)

DBAロールを所有しているユーザは、DB内のすべてのオブジェクトに対してのアクセス権限やCreate権限を持っているため、DBのオブジェクトに関しては、なんでもできる。
しかし、DBを起動・停止するにはDBAロールではできない。
そこで、登場するのが、sysdba権限である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3477632/02427960-479c-5116-322c-56562b532480.png)
sysdba権限を持っているユーザは、DB村の起動・停止を行うことができる。


その他にもsysdba権限のような権限は、複数存在する。
簡易的だが、紹介する。
- SYSDBA(DBの起動・停止やバックアップ・リカバリができる権限)
- SYSOPER(DBの起動・停止を行う権限)
- SYSASM(ASM全体を管理する権限)
- SYSBACKUP(RMANを使用したDBのバックアップができる権限)
- SYSDG(データガードに関するフェイルオーバー等ができる権限)
- SYSKM(キーの暗号化ができる権限)

上記の特別な権限が付与されているかは、``` V$PWFILE_USERS``` ビューで確認することができる。
こちらについての詳細な話は、第三回に詳しく話す。

# 3. 類似するsystemユーザについて

systemユーザは、一言でいうと
oracle社が用意した毎日の保守運用作業・データの管理を行う際に使用するユーザ
である。
sysユーザは、強力な権限がある便利な反面、危険を伴うユーザでもある。
そのことから、基本的にほとんど使用しないことが推奨されている。

そこで、基本的な毎日の業務で使用を推奨されているのが、systemユーザである。
systemユーザは、sysdba権限などの特別な権限は付与されてない。
しかし、DBAロールが付与されている

```SQL

SQL> select GRANTEE,GRANTED_ROLE from dba_ROLE_PRIVS where GRANTEE='SYSTEM'
  2  ;

GRANTEE                        GRANTED_ROLE
------------------------------ ------------------------------
SYSTEM                         DBA
SYSTEM                         AQ_ADMINISTRATOR_ROLE

SQL> select * from V$PWFILE_USERS where USERNAME='SYSTEM';

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

SQL>
```

このことから、基本的な保守運用作業はsystemユーザで実施するのが基本的である。

# 4. まとめ
- sysユーザは、DBAロールだけでなく、oracleが内部的に作成したほぼすべてのロールの権限が付与されている。
- 上記に加えて、sysdba権限という特別な権限も持っている
- 特別な権限は、sysdba権限のほかにも複数存在する
- systemユーザは、DBAロールが付与されているoracleが提供する作業用ユーザである