Oracle GRANT(権限付与)を理解する

OracleでGRANT(権限付与)する方法と、付与されたオブジェクト権限の確認方法です。

Oracle GRANT(権限付与)を理解する

Oracle の権限には「オブジェクト権限」と「システム権限」の二種類があります。

オブジェクト権限は、他のユーザーが所有しているオブジェクト(表やビュー)に対する権限のことで、システム権限は、Oracle を管理するためのデータベース全体に対する権限のことです。

Oracle GRANTって普段あまり使わないので忘れがちです。ここできっちり覚えておきましょう。


GRANT の構文を理解する

まずは GRANT の構文を理解しておきましょう。

  • GRANT システム権限 TO (ユーザー名 | ロール名 | PUBLIC) [WITH ADMIN OPTION]
  • GRANT オブジェクト権限 ON (オブジェクト名) TO (ユーザー名 | ロール名 | PUBLIC) [WITH GRANT OPTION]

WITH ADMIN OPTION もしくは WITH GRANT OPTION を付与すると、その権限を別のユーザーに対して再度付与することができます。また PUBLIC を指定するとインスタンス内の全ユーザーに権限を与えることができます。いずれも危険なのであまりおすすめしません。できるだけ明示的に権限付与するように心がけましょう。

テーブルに権限付与する

実務でよく使うのが、別のスキーマが保持している情報を提供してもらうというケースですね。テーブルに権限を与えて、参照したり更新したりできるようにします。

例えば、SCOTT というユーザーの所有する MY_TABLE を、TIGER というユーザーが SELECT、UPDATE、DELETE、INSERT できるよう権限付与してみます。


GRANT SELECT,UPDATE,DELETE,INSERT ON SCOTT.MY_TABLE TO TIGER;

これで TIGER は SCOTT の持っている MY_TABLE へアクセスできるようになります。

プロシージャやパッケージに権限付与する

テーブルへの参照や更新ももちろんのことですが、実務ではプロシージャやパッケージオブジェクトの共有も盛んにおこなわれていますね。

同じ例として、SCOTT というユーザーの所有する MY_PROCEDURE を、TIGER というユーザーが実行できるよう権限付与してみます。


GRANT EXECUTE ON SCOTT.MY_PROCEDURE TO TIGER

全ユーザーのテーブルに対してアクセスする

全ユーザーのテーブルにアクセスすることもできます。


GRANT SELECT ANY TABLE,UPDATE ANY TABLE,DELETE ANY TABLE,INSERT ANY TABLE TO SCOTT;

SYSユーザー(AS SYSDBAでログインするユーザー)で実行する必要があるので、正直使っている環境ってあるのかな。セキュリティ的にもどうかと思うので利用はおすすめしませんね。

与えた権限を削除する

与えた権限を削除するには REVOKE を使います。

  • REVOKE システム権限 FROM (ユーザー名 | ロール名 | PUBLIC)
  • REVOKE オブジェクト権限 ON (オブジェクト名) FROM (ユーザー名 | ロール名 | PUBLIC)

SQLを書くとこんな感じです。


REVOKE SELECT,UPDATE,DELETE,INSERT ON SCOTT.MY_TABLE FROM TIGER;

正直あんまり使わないですね。

付与されている権限を確認する

付与されている権限を確認するにはいくつかの方法があります。

ROLE_PRIVS: ユーザに付与されたロールを確認する。
SYS_PRIVS: ユーザーに付与されたシステム権限を確認する。
TAB_PRIVS: ユーザーに付与されたオブジェクト権限を確認する。

アプリのエンジニアがよく利用する「ユーザーに付与されたオブジェクト権限を確認する」場合はこんな感じ。


SELECT * FROM USER_TAB_PRIVS;

システム規模が大きくなるほど、管理が複雑かつ難しくなりますからね。忘れた場合やドキュメントと一致しているか確認する場合は、上記の SQL を実行してチェックしましょう。

よく使うロールとシステム権限

私が開発環境を作るときに使っている SQL です。最低限の権限を付与しています。うっかり DBA とか付けていると、本番導入時にトラブルの原因となったりしますので、開発時はできるだけシンプルに構成した方がいいかと思っています。

こちらは SCOTT というユーザーだった場合のサンプルです。


GRANT CONNECT TO SCOTT;
GRANT EXP_FULL_DATABASE TO SCOTT;
GRANT IMP_FULL_DATABASE TO SCOTT;
GRANT OEM_MONITOR TO SCOTT;
GRANT RESOURCE TO SCOTT;
GRANT ALTER ROLLBACK SEGMENT TO SCOTT;
GRANT ALTER TABLESPACE TO SCOTT;
GRANT CREATE ANY MATERIALIZED VIEW TO SCOTT;
GRANT CREATE ANY SEQUENCE TO SCOTT;
GRANT CREATE ANY TABLE TO SCOTT;
GRANT CREATE ANY VIEW TO SCOTT;
GRANT CREATE DATABASE LINK TO SCOTT;
GRANT CREATE SESSION TO SCOTT;
GRANT CREATE SYNONYM TO SCOTT;
GRANT CREATE VIEW TO SCOTT;
GRANT DEBUG ANY PROCEDURE TO SCOTT;
GRANT DEBUG CONNECT SESSION TO SCOTT;
GRANT DELETE ANY TABLE TO SCOTT;
GRANT EXECUTE ANY LIBRARY TO SCOTT;
GRANT EXECUTE ANY PROCEDURE TO SCOTT;
GRANT INSERT ANY TABLE TO SCOTT;
GRANT SELECT ANY TABLE TO SCOTT;
GRANT UNLIMITED TABLESPACE TO SCOTT;
GRANT UPDATE ANY TABLE TO SCOTT;

参考程度に。

まとめ

OracleでGRANT(権限付与)する方法と、付与されたオブジェクト権限の確認方法を紹介しました。

Oracleでは権限が無いと何も出来ません。特にユーザー作成したばかりの段階では、システム権限を与えなければ、データベースに接続することもできないし、自分のオブジェクトを操作できないですからね。

ここでは割愛していますが、システム権限はかなりの種類があります。私も付与したことない権限もたくさんありますので、あんまえらそうなことはいえないのですが、システムの利用環境や扱うデータの種類に合わせて最適な権限設定をおこない、情報漏えいなど発生しない環境を構築する必要があるのではないかと思います。

皆さんも GRANT する時はくれぐれもご注意を。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。