Oracleには「システム権限」と「sysdba権限」があります。実はこれ似ていますが別ものです。システム権限一覧という表現があるように、システム権限にはいろいろな権限(alter system、create sequence、drop any table、、)が存在します。これら多くのシステム権限が付与されているのがDBAロールです。それに対し「sysdba権限」は「権限そのもの」で最も強力な権限です。DBAロールを保持していればほとんど困りませんが、Oracleの立ち上げや停止はできません。
Oracleには、高度な管理操作を実行するための「管理権限」があり、その一つの権限がsysdbaという訳です。私も長く、”sysdba”っていう「システム権限」なのかと勘違いしていましたが異なります。その証拠にdba_sys_privs内にsysdbaは存在しません。
参考までにですがデフォルトでSYSDBA権限を保有しているのはSYSユーザのみです。SYSTEMユーザもSYSDBA権限は保有していません。
sysdba権限を付与
デフォルトではsysdba権限を保持しているのはsysユーザだけです。なので以下grantはsysユーザでのみ実行可能です。
grant sysdba to sooni ;
SQL> grant sysdba to sooni
2 ;
権限付与が成功しました。
SQL>
V$PWFILE_USERSを参照する事で確認できます
上記の通りdba_sys_privsでは確認できません。その代わりに V$PWFILE_USERSを参照する事で確認できます 。
SELECT USERNAME,SYSDBA,SYSOPER,SYSASM FROM V$PWFILE_USERS ;
col USERNAME for a10 col SYSDBA for a6 col SYSOPR for a6 col SYSASM for a6
SQL> col USERNAME for a10
SQL> col SYSDBA for a6
SQL> col SYSOPR for a6
SQL> col SYSASM for a6
SQL> SELECT t.USERNAME,t.SYSDBA,t.SYSOPER,t.SYSASM FROM V$PWFILE_USERS t
2 ;
USERNAME SYSDBA SYSOP SYSASM
---------- ------ ----- ------
SYS TRUE TRUE FALSE
SYSDG FALSE FALSE FALSE
SYSBACKUP FALSE FALSE FALSE
SYSKM FALSE FALSE FALSE
SOONI TRUE FALSE FALSE
SQL>
マルチテナント構成の場合CDB(ルート)では付与できません
各PDBへ接続しなおして(alter session)の付与となります。
SQL> grant sysdba to sooni
2 ;
grant sysdba to sooni
*
行1でエラーが発生しました。:
ORA-65175: SYSDBA権限をルートでローカルには付与できません
SQL> col NAME for a16
SQL> col OPEN_MODE for a16
SQL> select name, open_mode from v$pdbs
2 ;
NAME OPEN_MODE
---------------- ----------------
PDB$SEED READ ONLY PDBORCL READ WRITE
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container = PDBORCL
2 ;
セッションが変更されました。
SQL> grant sysdba to sooni
2 ;
権限付与が成功しました。