すべて重要!![補足]
オブジェクト権限でないものがシステム権限である。
[構文]
GRANT システム権限名 [ , システム権限名 , ・・・ ]
TO ユーザ名 [ , ユーザ名 , ・・・ ]
[ WITH ADMIN OPTION ];※WITH ADMIN OPTIONについては3-5で説明
■システム権限は
全部で80種類以上およそ126ある。
- 例)
- 表を作る権限
(CREATE TABLE権限)- ユーザを作る権限
(CREATE USER権限)- セッションを開始する(ログインする)権限
(CREATE SESSION権限)- など
例えばユーザsakuraにCREATE SESSION権限を与えるには、データベース管理ユーザで次のSQLを実行する。
GRANT create session TO sakura; ■ユーザ名にPUBLICを指定すると、すべてのユーザに権限を与えることができる。PUBLICに与えた権限は、作成済みのユーザだけでなく、それ以降に作成するユーザにも適応する。
- 例)
- ユーザがデータベースに接続するにはCREATE SESSION権限が必要だが、ユーザを作成するたびにCREATE SESSION権限を与えるのは効率が悪い。
そこで、PUBLICに対してCREATE SESSION権限を与えておけば、今後作成するユーザに対して権限を与える必要がなくなる。
CREATE USER ユーザA IDENTIFIED BY パスワードA;
GRANT create session TO ユーザA;
CREATE USER ユーザB IDENTIFIED BY パスワードB;
GRANT create session TO ユーザA;
CREATE USER ユーザC IDENTIFIED BY パスワードC;
GRANT create session TO ユーザA;
・
・
GRANT create session TO public;
CREATE USER ユーザA IDENTIFIED BY パスワードA;
CREATE USER ユーザB IDENTIFIED BY パスワードB;
CREATE USER ユーザC IDENTIFIED BY パスワードC;
・
・
■現在接続中のユーザが持っているシステム権限を調べるには、データ・ディクショナリ
SESSION_PRIVSを参照する。実習用ユーザでログインし、自分が持つシステム権限を確認しよう。
SQL> CONNECT om??/pass@136ora816
SQL> SELECT * FROM session_privs;
[構文]
REVOKE システム権限名 [ , システム権限名 , ・・・ ]
FROM ユーザ名 [ , ユーザ名 , ・・・ ];■GRANT システム権限 TO ユーザ名;で与えたシステム権限を取り消す(剥奪する)には
REVOKEコマンドを使用する。
- 例)、ユーザsakuraに与えたCREATE TABLE権限を取り消す
REVOKE create table FROM sakura; - 注意!!
- GRANTは、〜「
TO」ユーザ名
REVOKEは、〜「FROM」ユーザ名■ユーザ名にPUBLICを指定すると、
PUBLICに与えた権限(GRANT 〜 TO public;)を取り消すことができる。
- 個々のユーザに直接与えた権限をPUBLICで取り消すことはできない。
- PUBLICに与えた権限を、個別のユーザのみ取り消すことはできない。
すべて重要!![補足]
- システム権限を与えるには
GRANT ANY PRIVILEGE権限が必要。 WITH ADMIN OPTION付でもらった権限は、他のユーザに渡すことができる。
問題1
PUBLICを用いて付与したシステム権限を、特定のユーザだけから取り出すことはできる?
(「できる」「できない」で答えよ)問題2
次のようにユーザ設定の処理を行った。
SQL> CONNECT system/manager
接続されました。
SQL> CREATE USER aaa IDENTIFIED BY aaa;
ユーザーが作成されました。
SQL> CREATE USER bbb IDENTIFIED BY bbb;
ユーザーが作成されました。
SQL> GRANT create session, create sequence TO aaa;
権限付与が成功しました。
SQL> GRANT create session, alter session TO public;
権限付与が成功しました。
SQL> REVOKE alter session FROM public;
取消が成功しました。この後、a〜fのように処理を続けるが、それぞれの処理でエラーになるものを答えよ。
- SQL> CONNECT aaa/aaa
- SQL> ALTER SESSION SET NLS_DATA_FORMAT='YYYY/MM/DD';
- SQL> CREATE SEQUENCE ss1;
- SQL> CONNECT bbb/bbb
- SQL> ALTER SESSION SET NLS_DATA_FORMAT='YYYY/MM/DD';
- SQL> CREATE SEQUENCE ss1;