8章 ユーザの管理
では本章ではユーザの管理について学んでいきたいと思います。
データベースでテーブルやそのテーブルに対しSELECT文を実行できる
一般ユーザを作成していきましょう。
事前定義のユーザ
まず始めに事前定義ユーザについて確認していきましょう。
データベースを作成するとユーザが事前に作成されます。
| SYS | 管理者用のユーザ。 データディクショナリの所有者。
 | 
| SYSTEM | 管理者用のユーザ。 SYSDBA,SYSOPER権限は含まれない。
 | 
| SYSMAN | Oracle Enterprise Managerの データベース管理ユーザ。
 | 
| DBSNMP | Oracle Enterprise Managerの データベース管理ユーザ。
 | 
ユーザの作成や表領域の作成などデータベースの管理作業は
SYSやSYSTEMユーザを使用します。
これらの管理ユーザは強い権限を保持しているので、
アプリケーションで使用するユーザとして使用しないでください。
また上記ユーザは事前に作成されるユーザの一部です。
その他の事前定義ユーザは以下を参照ください。
「Oracle Database管理者ガイド 12cリリース1 (12.1)」
ユーザの作成
アプリケーションで使用するユーザは一般ユーザで作成します。
データベースのセキュリティを高めるため、必要な権限のみ付与していきます。
  [構文] ユーザの作成
 CREATE USER ユーザ名
 IDENTIFIED BY パスワード
 [ QUOTA サイズ | UNLIMITED ON 表領域名 ]
 [ DEFAULT TABLESPACE 表領域名 ]
 [ TEMPORARY TABLESPACE 表領域名 ];
QUOTA サイズ | UNLIMITED ON 表領域名
指定した表領域の使用可能な上限のサイズを指定します。
UNLIMITEDの場合、無制限にその表領域を使用できます。
DEFAULT TABLESPACE 表領域名
オブジェクト作成時、デフォルトで格納される表領域を指定します。
TEMPORARY TABLESPACE 表領域名
一時データを格納するデフォルトの一時表領域を指定します。
では実行例を見ていきましょう。
  SQL> CREATE USER test_user IDENTIFIED BY test
    2  QUOTA 30M ON users
    3  DEFAULT TABLESPACE users
    4  TEMPORARY TABLESPACE temp;
  User created.
 
一般ユーザを作成できましたが、
作成したtest_userユーザはまだ1つの権限も持っていません。
データベースに接続する権限もありません。
  SQL> CONNECT test_user/test
  
  ERROR:
  ORA-01045: user TEST lacks CREATE SESSION privilege; logon denied
  Warning: You are no longer connected to ORACLE.
 
上記の様に、まだ接続する権限も付与していない為、
データベースに接続しようとするとエラーが発生します。
ユーザ権限
データベースに対する操作は権限が必要です。
データベース権限は2つのタイプがあります。
・システム権限
・オブジェクト権限
システム権限はデータベース処理に関連する権限であり、
オブジェクト権限はテーブルなどのオブジェクトに対する権限です。
システム権限はたくさんあり全ての権限を紹介できませんが、
以下システム権限の一部紹介です。
システム権限一覧
| CREATE SESSION権限 | データベースに接続するシステム権限 | 
| CREATE TABLE 権限
 | テーブルを作成するシステム権限 | 
| SELECT ANY TABLE権限
 | どんなテーブルでも SELECTできるシステム権限
 | 
| DROP ANY TABLE権限 | どんなテーブルでも 削除できるシステム権限
 | 
一方オブジェクト権限はオブジェクトに対する権限であり以下があります。
オブジェクト権限一覧
| SELECT権限 | 対象オブジェクトのデータ検索権限 | 
| INSERT権限 | 対象オブジェクトのデータ挿入権限 | 
| UPDATE権限 | 対象オブジェクトのデータ更新権限 | 
| DELETE権限 | 対象オブジェクトのデータ削除権限 | 
| EXECUTE権限 | 対象オブジェクトの実行権限 | 
EXECUTEは実行権限であり、PL/SQLなどのプログラムを実行する時の権限です。
権限の有効範囲
自分が作成したオブジェクトに、オブジェクト権限は必要ありません。
テーブルを作成し、そのテーブルにデータを登録したい場合は、
自分の所有物でないオブジェクトに対しては権限が必要となります。
 
権限の付与
それではシステム権限の付与方法です。
システム権限を付与するには管理者ユーザでなくては実行できません。
  [構文] システム権限の付与
 GRANT システム権限名
 TO ユーザ名 [ WITH ADMIN OPTION ];
WITH ADMIN OPTIONは付与されたユーザが別のユーザに対し、
その権限を別のユーザに付与することができます。
  [構文] オブジェクト権限の付与
 GRANT オブジェクト権限名 ON オブジェクト名
 TO ユーザ名 [ WITH GRANT OPTION ];
オブジェクト権限の付与もシステム権限とほぼ同じです。
ON句にオブジェクト名を指定します。
WITH GRANT OPTIONはWITH ADMIN OPTIONと同じオプションです。
では先ほど作成したユーザにシステム権限を付与していきます。
  $ sqlplus / as sysdba
  SQL> GRANT CREATE SESSION TO test_user;
  Grant succeeded.
  SQL> GRANT CREATE TABLE TO test_user;
  Grant succeeded.
  SQL> CONNECT test_user/test
  Connected.
  
CREATE SESSION権限が付与されたため、
test_userユーザはデータベースに接続できました。
  SQL> show user
  
  USER is "TEST_USER"
  SQL> CREATE TABLE test_tbl 
    2> ( id number(10), name varchar2(10));
  Table created.
  SQL> INSERT INTO test VALUES (10,'TEST');
  1 row created.
  SQL> COMMIT;
  Commit complete.
  SQL> SELECT * FROM test_tbl;
          ID NAME
  ---------- ----------
          10 TEST
CREATE TABLE権限が付与されているため、テーブルが作成できました。
また作成したテーブルに対し、オブジェクト権限がなくても、
SELECTやINSERT文が実行できました。
では別ユーザを作成し、このtest_tblテーブルをSELECTする権限を付与してみます。
新しくTOMユーザを作成し、必要な権限を付与します。
  SQL> CONNECT / as sysdba
  Connected.
  SQL> CREATE USER tom IDENTIFIED BY tom;
  User created.
  SQL> GRANT CREATE SESSION TO tom;
  Grant succeeded.
  SQL> CONN tom/tom
  Connected.
  SQL> SELECT * FROM test_user.test_tbl;
  select * from test_user.test_tbl
                     *
  ERROR at line 1:
  ORA-00942: table or view does not exist
  
TOMユーザで接続し、TEST_USERのTEST表を
SELECTしましたが、オブジェクト権限がないためエラーとなりました。
それでは権限を付与してみましょう。
  SQL> CONN test_user/test
  Connected.
  SQL> GRANT SELECT ON test_tbl TO tom;
  Grant succeeded.
  SQL> CONN tom/tom
  Connected.
  SQL> SELECT * FROM test_user.test_tbl;
          ID NAME
  ---------- ----------
          10 TEST
          
今度は権限を付与したのでSELECTすることができました。
[補足] オブジェクト権限の付与
オブジェクト権限はテーブルだけでなく、
ビューに対する権限も付与が可能です。
索引の使用権限は不要です。
索引は権限に関係なく使用されます。
権限の取消し
次にシステム権限の取消の方法です。
  [構文] システム権限の取消
 REVOKE システム権限
 FROM ユーザ名;
権限の取消はREVOKEコマンドを使用します。
オブジェクト権限もほぼ同様の構文です。
  [構文] オブジェクト権限の取消
 REVOKE システム権限 ON オブジェクト名
 FROM ユーザ名;
オブジェクト権限の取消はON句に対象のオブジェクト名を指定します。
  SQL> show user
  
  USER is "TEST_USER"
  SQL> REVOKE SELECT ON test_tbl FROM tom;
  Revoke succeeded.
  SQL> CONN tom/tom
  Connected.
  SQL> select * from test_user.test_tbl;
  select * from test_user.test_tbl
                          *
  ERROR at line 1:
  ORA-00942: table or view does not exist
 
権限の取消は再ログイン後有効ではなく、即座に取消されます。
一般ユーザを作成する一連の作業について確認してきました。
次回は権限に関連するロールについて学んでいきます。