権限の目的
権限という概念がある目的は、ユーザーごとにできることを分けることでデータベースを安全に運用するためです。
例えば、会社を想像してほしいのですが、社長と新卒の社員を想像してみてください。
社長が会社の最終決定権を持っているの対して、新卒の社員は雑用の仕事を任されるはずです。
雑用ですら手一杯の新卒の社員に会社の最終決定権を持たしてしまうと恐ろしいことが起きてしまうことは簡単に予想できます。
データベースも同じでデータ削除をして良い人、スキーマを作成していい人などの様に権限を切り分けることで安全に運用できます。
また、別の切り口で考えるとシステム運用のために権限を振り分けるという理由もあります。
会社内で部署が存在するように、
Aユーザーはa業務関連のテーブルを操作でき、Bユーザーはb業務とc業務関連のテーブルを操作できる様にするために権限を振り分ける事もできます。
営業部が採用権限がないようなイメージですね!
話がゴチャゴチャしてしまいましたが、権限はとにかく必要という事です!!
権限の構文
--権限の付与にはGRANT構文。
GRANT SELECT,INSERT,UPDATE ON usr1.TEST TO usr2;
--権限の剥奪にはREVOKE構文。
REVOKE SELECT,INSERT,UPDATE ON usr1.TEST from usr2;
権限の種類
システム権限
システム権限とはデータベースに対する命令を行うための権限のことを指します。
言葉を柔らかくして説明するとOracle様にお願いを聞いてもらうための装備のような感覚です。
例えば、社員証がないと会社に入れない様に命令ごとのシステム権限がないとOracle様が動いてくれずDBに対して何も実行することができません。(難しく感じた方ごめんなさい)
システム権限の種類は数多くあるので、自分が勉強した時にイメージしやすかったものだけ紹介します。
ユーザーの作成 | CREATE USER |
データベースへの接続 | CREATE SESSION |
表の作成 | CREATE TABLE |
僕は初めてOracleでユーザーを作成した際にSESSION権限を付与するのを忘れてしまい、DB接続ができず3日ほど立ち往生した経験があります。最低限付与しなければいけない権限などもあるので一度は目を通したほうが良いかもしれません!
ちなみにこのページ見やすかったのでシステム権限の種類について確認したい方は呼んでみてください。
ADMIN OPTION
他のユーザーからシステム権限を付与され、その権限を別のユーザーに付与する場合は「GRANT ADMIN」を指定する必要があります。
下記コードでは、「GRANT ADMIN」を指定することでusr2は別のユーザーにオブジェクト権限を付与できるようになりました。
--usr2は接続権限を付与され、他人に譲渡できる。
GRANT CREATE SESSION TO usr2 WITH ADMIN OPTION;
オブジェクト権限
オブジェクト権限とは自分以外のオブジェクトに対して命令を実行できる様にするための権限です。
これはイメージしやすいと思うのですが、友達の物(パソコンでも車でも何でも良いです)に対して友達の許可がないと使用するのはNGのはずです。
Oracleも一緒で、自分以外のユーザーが保持しているオブジェクトに対して権限がないとそのオブジェクトには何も実行することができません。
※ちなみに、自分が作成したオブジェクトに対しては権限はいりません。
GRANT OPTION
他のユーザーからオブジェクト権限を付与され、その権限を別のユーザーに付与する場合は「GRANT OPTION」を指定する必要があります。
下記コードでは、「GRANT OPTION」を指定することでusr2は別のユーザーにオブジェクト権限を付与できるようになりました。
また、「GRANT OPTION」を指定して付与された権限は大元のユーザーによって権限が削除されると連鎖的に権限が削除されます。
--usr2は別のユーザーに権限を付与できるようになった
GRANT SELECT,INSERT ON usr1.TEST TO usr2 WITH GRANT OPTION;
--usr2が実行。usr3にも同じ権限付与できる。
GRANT SELECT,INSERT,UPDATE ON usr1.TEST TO usr3;
--usr1が実行。usr2の権限が消えると共に連鎖的にusr3の権限も消える。
REVOKE SELECT,INSERT,UPDATE ON usr1.TEST FROM usr2;
ロール
ロールとは権限をまとめたもので、プログラミングでいうところの配列のような扱いです。
配列のように扱えることで一度定義しておけば繰り返し呼び出せるという利点があるため、実務ではよく使われているらしいです。(先輩が言ってた。)
また、ロールの凄いところはシステム権限とオブジェクト権限を同時に格納できるという点です。便利ですねー。
CREATE ROLE TEST_ROLL;
GRANT CREATE SESSION TO TEST_ROLL; --システム権限付与
GRANT SELECT,INSERT ON TEST_ROLL; --オブジェクト権限付与
GRANT TEST_ROLL TO usr1;
・PUBLICロールと呼ばれる全ユーザーに適用されるロールがある。