※ この記事にはアフィリエイトリンクが含まれます
Oracleのユーザ権限について、あいまいなまま設定していたりしませんか?
Oracleでは、ユーザごとに「どんな操作をしてよいか」を厳密に制御しており、接続やテーブル作成、データの参照・更新など、すべての操作に対して明確な権限が必要です。
例えば、以下のようなシーンは非常によくあります。
- 開発環境で新しいユーザを作成したが、接続できない
- 他のスキーマのテーブルを参照したいが、
ORA-01031: 権限がありません
と怒られた - 管理者が付与した権限を整理したいけど、どのユーザが何を持っているのか分からない
こうした悩みを解決するには、Oracleの権限モデル(システム権限・オブジェクト権限・ロール)をしっかり理解することが大切です。
本記事では、初心者でも迷わないように、
- 権限の基本構造
GRANT
/REVOKE
コマンドの使い方- ロール(ROLE)を使った権限管理
- よくあるエラーと確認方法
といったポイントを、実際のSQL例を交えながら解説していきます。
記事の最後には、Oracleをさらに深く学びたい方向けに、実務でも役立つおすすめの書籍を紹介しますので、ぜひ最後まで読んでみてください。
Oracleの権限とは?基本の考え方
そもそも、権限ってどういうもの?というところから見てみましょう。
Oracleでは、ユーザーが行える操作を細かく制御するために、「権限」という仕組みがあります。
この権限は大きく分けて、次の2種類に分類されます。
システム権限
データベース全体に対して有効な権限です。
ユーザの作成や、テーブル・ビューの作成、データベース接続など、システムレベルの操作を行うためのものです。
例えば以下のような権限があります。
権限名 | 内容 |
---|---|
CREATE SESSION | データベースへ接続できる |
CREATE TABLE | テーブルを作成できる |
CREATE VIEW | ビューを作成できる |
CREATE USER | 新しいユーザを作成できる |
DROP USER | ユーザを削除できる |
システム権限は、データベース全体に影響します。誤って与えすぎると、セキュリティリスクになるため、必要最小限の付与が鉄則です。
オブジェクト権限
特定のオブジェクト(テーブル・ビューなど)に対して与える権限です。
あるユーザが他のスキーマのテーブルを参照・更新したいときに必要になります。
主なオブジェクト権限は次の通りです。
権限名 | 内容 |
---|---|
SELECT | データの参照ができる |
INSERT | データの追加ができる |
UPDATE | データの更新ができる |
DELETE | データの削除ができる |
REFERENCES | 外部キー参照ができる |
たとえば、他のスキーマ(HR
)にあるEMPLOYEES
テーブルに対してSELECT
が可能になります。
権限の関係は、ざっくりですが下図のとおりです。
Oracle Database 全体
├─ システム権限(CREATE USER など)
│ → 管理者が操作可能
└─ スキーマ(各ユーザ)
├─ オブジェクト権限(SELECT, UPDATE など)
│ → 他ユーザへ付与できる
└─ 自分のテーブルなどを管理
- システム権限:データベース全体に対する操作権限
- オブジェクト権限:特定のテーブルやビューに対する操作権限
Oracleではこの2つを組み合わせて、細かくアクセス制御を行っています。
次章では、実際に GRANT
文を使ってユーザに権限を付与する方法を解説します。
ユーザ権限を付与する(GRANT文の使い方)
Oracleでユーザに操作権限を与えるには、GRANT
(グラント)文を使用します。GRANT
は「○○の権限を△△に与える」という意味で、最も基本的な権限管理コマンドです。
GRANT文の基本構文
GRANT 権限名 TO ユーザ名;
たとえば、ユーザTEST_USER
にデータベースへ接続する権限を与える場合は、次のように書きます。
GRANT CREATE SESSION TO TEST_USER;
これで TEST_USER
は sqlplus
や SQL Developer
などからログインできるようになります。
よく使うシステム権限の付与例
開発環境などで新規ユーザを作成した場合、基本的には以下の権限を与えておくとよいでしょう。
GRANT CREATE SESSION TO TEST_USER; -- 接続権限
GRANT CREATE TABLE TO TEST_USER; -- テーブル作成権限
GRANT CREATE VIEW TO TEST_USER; -- ビュー作成権限
GRANT CREATE SEQUENCE TO TEST_USER; -- シーケンス作成権限
これらを付与しておけば、基本的なテーブル操作が可能になります。
複数の権限を一度に付与する
複数の権限は、カンマで区切ってまとめて付与できます。
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO TEST_USER;
SQLを一つにまとめることで、スクリプトの管理もシンプルになります。
WITH ADMIN OPTIONの使い方と注意点について
特定のユーザに「他のユーザへ同じ権限を付与できる権限」を持たせたいというような場合は、WITH ADMIN OPTION
をつけます。
GRANT CREATE USER TO ADMIN_USER WITH ADMIN OPTION;
このようにすると、ADMIN_USER
自身が他のユーザに CREATE USER
権限を与えられるようになります。
WITH ADMIN OPTION
は誤用すると権限がどんどん広がるため、実務では原則として管理者(DBA)だけが使うようにしましょう。
付与した権限を確認する方法
付与済みの権限は、以下のビューで確認できます。
-- システム権限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'TEST_USER';
-- オブジェクト権限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'TEST_USER';
もし権限が不足している場合は、ORA-01031: 権限がありません
というエラーが出るため、
このビューで確認する習慣をつけておくと便利です。
権限を取り消す(REVOKE文の使い方)
誤って与えすぎた権限や、不要になった権限を削除するには、REVOKE
(リヴォーク)文を使います。基本的には、権限を付与するGRANT
とは反対の操作になります。
REVOKE文の基本構文
REVOKE 権限名 FROM ユーザ名;
たとえば、TEST_USER
からテーブル作成権限を取り消したい場合は次のように書きます。
REVOKE CREATE TABLE FROM TEST_USER;
これで、TEST_USER
は新しいテーブルを作成できなくなります。
複数の権限をまとめて取り消す
GRANT
と同様に、複数の権限を一括で取り消すことも可能です。
REVOKE CREATE TABLE, CREATE VIEW FROM TEST_USER;
特に開発段階で、一時的に付与した権限を整理する際に便利です。
オブジェクト権限を取り消す
テーブルやビューなど、オブジェクトに対する権限を取り消す場合もREVOKE
文を使います。
REVOKE SELECT, INSERT ON HR.EMPLOYEES FROM TEST_USER;
このコマンドにより、TEST_USER
はHR.EMPLOYEES
テーブルにアクセスできなくなります。誤操作や情報漏えいのリスクを減らすため、不要なオブジェクト権限は定期的に見直しましょう。
ロール(ROLE)を使った権限管理
ユーザが増えると、個別に GRANT
/ REVOKE
を繰り返すのは非常に手間ですよね。
そんなときに役立つのが、ロール(ROLE) という仕組みです。
ロールを使うと、複数の権限をまとめて管理でき、ユーザ管理がぐっと楽になります。
ロールとは?
ロールとは、権限の束(グループ)のようなものです。
たとえば「開発者用ロール」「参照専用ロール」といった形で、用途ごとに権限をまとめられます。
イメージとしてはこんな感じです↓
DEV_ROLE : 開発者用のロール
┌────────────────────┐
│ ROLE:DEV_ROLE. |
│ ├─ CREATE SESSION │
│ ├─ CREATE TABLE │
│ ├─ CREATE VIEW │
└────────────────────┘
↓ まとめて付与!
GRANT DEV_ROLE TO TEST_USER;
このように、複数の権限をロールにまとめておけば、
ユーザに対して一括で管理・付与できるようになります。
ロールの作成方法
まずは、ロールを作成しましょう。
CREATE ROLE DEV_ROLE;
このコマンドで、新しいロール DEV_ROLE
が作成されます。
ロールに権限を付与する
続いて、そのロールに権限を付与します。
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO DEV_ROLE;
これで DEV_ROLE
は、接続・テーブル作成・ビュー作成の権限を持つロールになります。
ロールをユーザに付与する
次に、作成したロールをユーザに割り当てます。
GRANT DEV_ROLE TO TEST_USER;
これで、TEST_USER
は DEV_ROLE
に含まれるすべての権限を自動的に取得します。
将来的に別のユーザ(例:TEST_USER2
)にも同じロールを与えれば、同一権限を簡単に共有できます。
ロールの取り消し
ロールを取り消すには、次のようにします。
REVOKE DEV_ROLE FROM TEST_USER;
これで、TEST_USER
は DEV_ROLE
の権限をすべて失います。
ロールの付与状況を確認する
下記のSQLを実行することで、ロールの付与状況を確認できます。
-- ロールの一覧を確認
SELECT * FROM DBA_ROLES;
-- 各ロールに付与された権限を確認
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'DEV_ROLE';
-- ユーザに付与されているロールを確認
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'TEST_USER';
これらのビューを活用すれば、権限やロールの関係を一目で把握できます。
まとめ
ここまで、Oracleでユーザ権限を設定・管理する方法を解説してきました。
Oracleの権限管理は、一見ややこしく見えますが、
構造を理解すればとてもシンプルです。
区分 | 内容 | 代表的なコマンド |
---|---|---|
システム権限 | データベース全体に関わる権限 | CREATE SESSION , CREATE TABLE |
オブジェクト権限 | テーブルやビューなど個別オブジェクトに対する権限 | SELECT , INSERT , UPDATE |
ロール(ROLE) | 権限をまとめて管理する仕組み | CREATE ROLE , GRANT ROLE TO ユーザ |
Oracleの権限管理は、
「安全性」と「効率性」を両立させるための重要スキルです。
- 小規模環境では手動での
GRANT
/REVOKE
- 大規模環境ではロール設計による一元管理
この2つを使い分けながら、セキュリティを守りつつ生産性の高い運用を目指しましょう。
学習に役立つおすすめの書籍
Oracleを効率的に学べるおすすめ書籍を紹介します。
図解入門よくわかる 最新Oracleデータベースの基本と仕組み
図解で解説されている箇所が多く、初心者が全体像を理解するのに最適です。
Oracleの現場を効率化する100の技
初心者からベテランまで、経験レベルを問わず活用できる一冊で、Oracle Databaseユーザー必携の実践書 といえます。
忙しい現場でも、効率的に学びながら実践できる点が魅力。
コメント