Oracleデータベースで新しいユーザーを作成して権限を付与する方法を知りたいと思ったことはありませんか?
ユーザー管理はOracle DBAの最も基本的かつ重要な業務のひとつです。適切なユーザー作成と権限設定を行わないと、セキュリティリスクや運用トラブルの原因になります。
この記事では、CREATE USER文の基本構文から、表領域・プロファイルの指定、システム権限・オブジェクト権限の付与、ロールの活用、ユーザーの変更・削除、マルチテナント環境(CDB/PDB)での操作、トラブルシューティングまで、実務で必要な知識を網羅的に解説します。
ユーザー作成の前提知識
Oracleにおける「ユーザー」と「スキーマ」は密接に関連しています。まずは基本概念を整理しましょう。
ユーザーとスキーマの違い
- ユーザー:データベースに接続するためのアカウント(認証情報)
- スキーマ:ユーザーが所有するオブジェクト(テーブル、ビュー等)の集合
- Oracleではユーザーを作成すると同名のスキーマが自動的に作られます
- 1ユーザー=1スキーマの関係です(MySQLのように複数DBを自由に切り替える設計ではありません)
ユーザーを作成できる条件
ユーザーを作成するには、以下のいずれかの条件を満たす必要があります。
| 条件 |
説明 |
CREATE USER システム権限 |
ユーザー作成のみ可能 |
DBA ロール |
ユーザー作成を含むすべての管理操作が可能 |
SYS / SYSTEM ユーザー |
デフォルトの管理者アカウント |
注意:SYSユーザーで接続する場合は AS SYSDBA を付けて接続する必要があります。SYSTEMユーザーは通常のログインで操作できます。
CREATE USERの基本構文
新しいユーザーを作成するには CREATE USER 文を使用します。
基本構文
CREATE USER ユーザー名
IDENTIFIED BY パスワード
[DEFAULT TABLESPACE 表領域名]
[TEMPORARY TABLESPACE 一時表領域名]
[QUOTA サイズ ON 表領域名]
[PROFILE プロファイル名]
[ACCOUNT LOCK | ACCOUNT UNLOCK]
[PASSWORD EXPIRE];
最もシンプルなユーザー作成
まずは最小限の構文でユーザーを作成してみましょう。
SQL
-- 最もシンプルなユーザー作成
CREATE USER test_user
IDENTIFIED BY MyPassword123;
これだけでユーザーは作成されますが、この状態ではデータベースに接続すらできません。接続するには CREATE SESSION 権限の付与が必要です(後述)。
各オプションの詳細
| オプション |
説明 |
デフォルト値 |
IDENTIFIED BY |
パスワード認証(最も一般的) |
-(必須) |
DEFAULT TABLESPACE |
オブジェクト作成先の表領域 |
USERS |
TEMPORARY TABLESPACE |
ソート等に使う一時表領域 |
TEMP |
QUOTA |
表領域の使用上限 |
0(使用不可) |
PROFILE |
パスワードポリシー・リソース制限 |
DEFAULT |
ACCOUNT LOCK/UNLOCK |
アカウントのロック状態 |
UNLOCK |
PASSWORD EXPIRE |
初回ログイン時にパスワード変更を強制 |
非期限切れ |
ポイント:QUOTAのデフォルトは0バイトです。つまりテーブルやインデックスを作成するには、必ずQUOTAを明示的に設定するか、UNLIMITED TABLESPACE 権限を付与する必要があります。初心者がつまずきやすいポイントなので注意しましょう。
実務でよく使うユーザー作成パターン
実際の業務では、用途に応じて適切なオプションを指定してユーザーを作成します。ここでは代表的なパターンを紹介します。
パターン1:開発用ユーザー
開発環境で使用する、比較的自由度の高いユーザーです。
SQL – 開発用ユーザー
-- 開発用ユーザーの作成
CREATE USER dev_user
IDENTIFIED BY DevPass2026#
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA UNLIMITED ON users;
-- 開発に必要な権限を付与
GRANT connect, resource TO dev_user;
GRANT create view, create synonym TO dev_user;
パターン2:アプリケーション接続用ユーザー
Webアプリケーションからの接続に使用するユーザーです。必要最小限の権限のみ付与します。
SQL – アプリケーション用ユーザー
-- アプリケーション接続用ユーザー
CREATE USER app_user
IDENTIFIED BY AppSecure#2026
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA 500M ON app_data
PROFILE app_profile;
-- 接続権限のみ
GRANT create session TO app_user;
-- 必要なテーブルへの操作権限を個別に付与
GRANT SELECT, INSERT, UPDATE, DELETE
ON schema_owner.orders TO app_user;
パターン3:読み取り専用ユーザー
レポート作成やデータ分析用に、参照のみ可能なユーザーです。
SQL – 読み取り専用ユーザー
-- 読み取り専用ユーザー
CREATE USER readonly_user
IDENTIFIED BY ReadOnly#2026
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 0 ON users
PASSWORD EXPIRE;
-- 接続権限のみ付与(QUOTA 0なのでオブジェクト作成不可)
GRANT create session TO readonly_user;
注意:SELECT ANY TABLE はすべてのスキーマのテーブルを参照できる強力な権限です。本番環境では個別テーブルへの SELECT 権限を推奨します。
パターン4:初回ログイン時にパスワード変更を強制
セキュリティを重視する場合、管理者が設定した仮パスワードで作成し、ユーザー自身にパスワードを変更させます。
SQL
-- パスワード変更を強制するユーザー作成
CREATE USER new_employee
IDENTIFIED BY TempPass123
PASSWORD EXPIRE;
GRANT create session TO new_employee;
初回ログイン時に以下のメッセージが表示され、パスワード変更が求められます。
接続時の表示
ERROR:
ORA-28001: the password has expired
Changing password for new_employee
New password: ********
Retype new password: ********
Password changed
表領域(TABLESPACE)の設定
表領域は、データを物理的に格納するための領域です。ユーザー作成時に適切な表領域を指定することが重要です。
DEFAULT TABLESPACEとは
ユーザーがテーブルやインデックスを作成する際、TABLESPACE句を省略した場合のデフォルト格納先です。
SQL
-- 専用表領域を作成してユーザーに割り当て
CREATE TABLESPACE app_data
DATAFILE 'app_data01.dbf'
SIZE 500M
AUTOEXTEND ON NEXT 100M
MAXSIZE 5G;
CREATE USER app_owner
IDENTIFIED BY SecurePass#1
DEFAULT TABLESPACE app_data
QUOTA UNLIMITED ON app_data;
QUOTA(使用量制限)の設定
QUOTAを指定することで、ユーザーが使用できる表領域のサイズを制限できます。
SQL
-- 100MBの制限付き
CREATE USER limited_user
IDENTIFIED BY LimitPass#1
DEFAULT TABLESPACE users
QUOTA 100M ON users;
-- 複数の表領域にQUOTAを設定
CREATE USER multi_ts_user
IDENTIFIED BY MultiPass#1
DEFAULT TABLESPACE users
QUOTA 200M ON users
QUOTA 50M ON app_data;
-- 作成後にQUOTAを変更
ALTER USER limited_user QUOTA 500M ON users;
| QUOTA設定 |
意味 |
用途 |
QUOTA 0 ON ts |
使用不可 |
読み取り専用ユーザー |
QUOTA 100M ON ts |
100MBまで使用可能 |
通常ユーザー |
QUOTA UNLIMITED ON ts |
無制限 |
スキーマオーナー・開発者 |
ポイント:通常はデータベース作成時に作られる TEMP 表領域で十分です。大規模な分析処理を行うユーザーには専用の一時表領域を割り当てることもあります。
認証方式の種類
Oracleでは複数の認証方式をサポートしています。用途に応じて使い分けましょう。
| 認証方式 |
構文 |
用途 |
| パスワード認証 |
IDENTIFIED BY password |
最も一般的な認証方式 |
| OS認証 |
IDENTIFIED EXTERNALLY |
OSユーザーと連携 |
| グローバル認証 |
IDENTIFIED GLOBALLY |
LDAP/Active Directory連携 |
| スキーマ専用 |
NO AUTHENTICATION |
ログイン不可、スキーマのみ(18c以降) |
SQL – 各認証方式の例
-- パスワード認証(最も一般的)
CREATE USER normal_user IDENTIFIED BY Pass#2026;
-- OS認証(OSユーザー名と連携)
CREATE USER ops$oracle_user IDENTIFIED EXTERNALLY;
-- スキーマ専用アカウント(Oracle 18c以降)
-- ログインできないがオブジェクトは保持可能
CREATE USER data_schema NO AUTHENTICATION
DEFAULT TABLESPACE app_data
QUOTA UNLIMITED ON app_data;
プロファイル(PROFILE)の設定
プロファイルは、パスワードポリシーとリソース制限をまとめて管理する仕組みです。
カスタムプロファイルの作成
SQL
-- セキュリティ重視のプロファイルを作成
CREATE PROFILE secure_profile LIMIT
-- パスワードポリシー
PASSWORD_LIFE_TIME 90 -- 90日で期限切れ
PASSWORD_GRACE_TIME 7 -- 猶予期間7日
PASSWORD_REUSE_TIME 365 -- 365日間は同じパスワード再利用不可
PASSWORD_REUSE_MAX 12 -- 過去12回分は再利用不可
FAILED_LOGIN_ATTEMPTS 5 -- 5回失敗でロック
PASSWORD_LOCK_TIME 1/24 -- 1時間ロック
-- リソース制限
SESSIONS_PER_USER 3 -- 同時セッション数
IDLE_TIME 30 -- 30分アイドルで切断
CONNECT_TIME 480; -- 最大接続時間8時間
-- プロファイルを指定してユーザーを作成
CREATE USER secure_user
IDENTIFIED BY SecPass#2026
PROFILE secure_profile;
DEFAULTプロファイルの確認
SQL
-- DEFAULTプロファイルの設定値を確認
SELECT resource_name, resource_type, limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
ORDER BY resource_type, resource_name;
実行結果
RESOURCE_NAME RESOURCE_TYPE LIMIT
---------------------------- ---------------- ----------
FAILED_LOGIN_ATTEMPTS PASSWORD 10
PASSWORD_GRACE_TIME PASSWORD 7
PASSWORD_LIFE_TIME PASSWORD 180
PASSWORD_LOCK_TIME PASSWORD 1
PASSWORD_REUSE_MAX PASSWORD UNLIMITED
PASSWORD_REUSE_TIME PASSWORD UNLIMITED
CONNECT_TIME KERNEL UNLIMITED
IDLE_TIME KERNEL UNLIMITED
SESSIONS_PER_USER KERNEL UNLIMITED
プロファイルの注意点
- リソース制限を有効にするには
ALTER SYSTEM SET RESOURCE_LIMIT = TRUE が必要です
- パスワードポリシーは
RESOURCE_LIMIT の設定に関係なく常に有効です
- プロファイルを変更すると、そのプロファイルを使用するすべてのユーザーに即座に反映されます
パスワード管理
ユーザーのパスワード管理は、セキュリティの基本です。パスワードの変更、期限切れの管理、ロック解除の方法を解説します。
パスワードの変更
SQL
-- 管理者が他ユーザーのパスワードを変更
ALTER USER test_user IDENTIFIED BY NewPass#2026;
-- ユーザー自身がパスワードを変更
PASSWORD
-- Changing password for test_user
-- Old password: ********
-- New password: ********
-- Retype new password: ********
-- パスワードを期限切れにする
ALTER USER test_user PASSWORD EXPIRE;
アカウントのロック/アンロック
SQL
-- アカウントをロック(一時的に無効化)
ALTER USER test_user ACCOUNT LOCK;
-- アカウントをアンロック
ALTER USER test_user ACCOUNT UNLOCK;
-- ロック状態の確認
SELECT username, account_status, lock_date, expiry_date
FROM dba_users
WHERE username = 'TEST_USER';
| ACCOUNT_STATUS |
状態 |
対処方法 |
OPEN |
正常(ログイン可能) |
– |
LOCKED |
手動ロック |
ALTER USER ... ACCOUNT UNLOCK |
LOCKED(TIMED) |
ログイン失敗による自動ロック |
待機 or ACCOUNT UNLOCK |
EXPIRED |
パスワード期限切れ |
パスワード変更が必要 |
EXPIRED & LOCKED |
期限切れ + ロック |
UNLOCK + パスワード変更 |
GRANT文の基本構文
ユーザーに権限を付与するには GRANT 文を使用します。Oracleの権限は大きくシステム権限とオブジェクト権限の2種類に分かれます。
基本構文
-- システム権限の付与
GRANT 権限名 [, 権限名...] TO ユーザー名;
-- オブジェクト権限の付与
GRANT 権限名 ON スキーマ名.オブジェクト名 TO ユーザー名;
-- ロールの付与
GRANT ロール名 TO ユーザー名;
システム権限の付与
システム権限は、データベース全体に対する操作を許可する権限です。Oracleには200以上のシステム権限がありますが、よく使うものを整理します。
よく使うシステム権限一覧
| 権限 |
説明 |
対象 |
CREATE SESSION |
データベースに接続する |
全ユーザー必須 |
CREATE TABLE |
自スキーマにテーブルを作成 |
開発者 |
CREATE VIEW |
自スキーマにビューを作成 |
開発者 |
CREATE PROCEDURE |
PL/SQLプロシージャを作成 |
開発者 |
CREATE SEQUENCE |
シーケンスを作成 |
開発者 |
CREATE SYNONYM |
シノニムを作成 |
開発者 |
CREATE TRIGGER |
トリガーを作成 |
開発者 |
SELECT ANY TABLE |
全スキーマのテーブルを参照 |
DBA・分析者 |
UNLIMITED TABLESPACE |
全表領域で無制限に使用 |
スキーマオーナー |
CREATE USER |
ユーザーを作成する |
管理者 |
SQL – システム権限の付与例
-- 接続権限(最低限必要)
GRANT create session TO test_user;
-- 複数のシステム権限をまとめて付与
GRANT create table, create view, create sequence, create procedure
TO dev_user;
-- WITH ADMIN OPTION: 権限の再付与を許可
GRANT create session TO team_lead WITH ADMIN OPTION;
-- team_leadは他ユーザーにもCREATE SESSIONを付与できる
注意:WITH ADMIN OPTION は強力な機能です。この権限を持つユーザーは、他のユーザーにも同じ権限を付与できます。セキュリティの観点から、管理者以外には使用しないことを推奨します。
オブジェクト権限の付与
オブジェクト権限は、特定のテーブルやビューなどのオブジェクトに対する操作を許可する権限です。最小権限の原則に従い、必要なオブジェクトに必要な権限のみ付与することが重要です。
オブジェクト権限の種類
| 権限 |
テーブル |
ビュー |
プロシージャ |
シーケンス |
SELECT |
○ |
○ |
– |
○ |
INSERT |
○ |
○ |
– |
– |
UPDATE |
○ |
○ |
– |
– |
DELETE |
○ |
○ |
– |
– |
ALTER |
○ |
– |
– |
○ |
EXECUTE |
– |
– |
○ |
– |
INDEX |
○ |
– |
– |
– |
REFERENCES |
○ |
– |
– |
– |
オブジェクト権限の付与例
SQL
-- テーブルへのSELECT権限
GRANT SELECT ON hr.employees TO report_user;
-- 複数の権限をまとめて付与
GRANT SELECT, INSERT, UPDATE, DELETE
ON hr.employees TO app_user;
-- 特定カラムのみUPDATE可能にする
GRANT UPDATE (salary, commission_pct)
ON hr.employees TO payroll_user;
-- プロシージャの実行権限
GRANT EXECUTE ON hr.calc_bonus TO app_user;
-- シーケンスの使用権限
GRANT SELECT ON hr.emp_seq TO app_user;
-- 全ユーザーに権限を付与(PUBLICロール)
GRANT SELECT ON hr.departments TO PUBLIC;
-- WITH GRANT OPTION: 権限の再付与を許可
GRANT SELECT ON hr.employees TO team_lead
WITH GRANT OPTION;
WITH ADMIN OPTION と WITH GRANT OPTION の違い
WITH ADMIN OPTION:システム権限の再付与を許可。取り消し時に連鎖しない
WITH GRANT OPTION:オブジェクト権限の再付与を許可。取り消し時に連鎖する(付与した権限もすべて取り消される)
ロール(ROLE)の活用
ロールは、複数の権限をまとめて管理する仕組みです。ユーザーごとに個別に権限を付与するのではなく、ロールに権限をまとめ、ユーザーにロールを付与することで管理を効率化できます。
Oracleの定義済みロール
| ロール名 |
含まれる主な権限 |
用途 |
CONNECT |
CREATE SESSION |
DB接続のみ |
RESOURCE |
CREATE TABLE, CREATE SEQUENCE, CREATE PROCEDURE 等 |
開発者向け |
DBA |
ほぼすべてのシステム権限 |
管理者向け |
SELECT_CATALOG_ROLE |
データディクショナリの参照 |
分析・監査者向け |
注意:Oracle 12c以降、CONNECT ロールには CREATE SESSION のみが含まれます。以前のバージョンではCREATE TABLEなど複数の権限が含まれていましたが、セキュリティ強化のために縮小されました。RESOURCE ロールには UNLIMITED TABLESPACE が含まれるため、本番環境では注意が必要です。
カスタムロールの作成
SQL
-- カスタムロールの作成
CREATE ROLE app_readonly_role;
CREATE ROLE app_readwrite_role;
CREATE ROLE app_admin_role;
-- 読み取り専用ロールに権限を付与
GRANT create session TO app_readonly_role;
GRANT SELECT ON app_owner.customers TO app_readonly_role;
GRANT SELECT ON app_owner.orders TO app_readonly_role;
GRANT SELECT ON app_owner.products TO app_readonly_role;
-- 読み書きロール(読み取りロールを含む)
GRANT app_readonly_role TO app_readwrite_role;
GRANT INSERT, UPDATE, DELETE ON app_owner.orders TO app_readwrite_role;
-- ユーザーにロールを付与
GRANT app_readonly_role TO report_user;
GRANT app_readwrite_role TO app_user;
ポイント:ロールの階層化(ロールの中にロールを含める)を活用すると、権限管理がシンプルになります。上記の例では app_readwrite_role に app_readonly_role を含めることで、読み取り権限の重複定義を避けています。
権限の取り消し(REVOKE)
付与した権限を取り消すには REVOKE 文を使用します。
SQL
-- システム権限の取り消し
REVOKE create table FROM dev_user;
-- オブジェクト権限の取り消し
REVOKE SELECT ON hr.employees FROM report_user;
-- ロールの取り消し
REVOKE app_readonly_role FROM report_user;
-- 全権限を一括取り消し(ALL PRIVILEGES)
REVOKE ALL ON hr.employees FROM app_user;
REVOKEの連鎖動作
- オブジェクト権限:WITH GRANT OPTION で付与した権限をREVOKEすると、そのユーザーが他に付与した権限も連鎖的に取り消されます
- システム権限:WITH ADMIN OPTION で付与した権限をREVOKEしても、連鎖しません
権限とロールの確認方法
ユーザーに付与されている権限やロールを確認するためのビューを紹介します。
付与されたシステム権限の確認
SQL
-- ユーザーに直接付与されたシステム権限
SELECT privilege, admin_option
FROM dba_sys_privs
WHERE grantee = 'DEV_USER'
ORDER BY privilege;
-- ユーザーに付与されたロール
SELECT granted_role, admin_option, default_role
FROM dba_role_privs
WHERE grantee = 'DEV_USER'
ORDER BY granted_role;
-- ユーザーに付与されたオブジェクト権限
SELECT owner, table_name, privilege, grantable
FROM dba_tab_privs
WHERE grantee = 'DEV_USER'
ORDER BY owner, table_name;
実行結果例(dba_sys_privs)
PRIVILEGE ADMIN_OPTION
---------------------- ------------
CREATE PROCEDURE NO
CREATE SEQUENCE NO
CREATE SESSION NO
CREATE TABLE NO
CREATE VIEW NO
権限確認に使える主要ビュー
| ビュー名 |
確認内容 |
DBA_SYS_PRIVS |
付与されたシステム権限 |
DBA_TAB_PRIVS |
付与されたオブジェクト権限 |
DBA_ROLE_PRIVS |
付与されたロール |
DBA_COL_PRIVS |
カラムレベルの権限 |
ROLE_SYS_PRIVS |
ロールに含まれるシステム権限 |
ROLE_TAB_PRIVS |
ロールに含まれるオブジェクト権限 |
SESSION_PRIVS |
現在のセッションで有効な権限 |
ユーザーの変更(ALTER USER)
作成済みのユーザーの設定を変更するには ALTER USER 文を使用します。
SQL
-- パスワードの変更
ALTER USER test_user IDENTIFIED BY NewPass#2026;
-- デフォルト表領域の変更
ALTER USER test_user DEFAULT TABLESPACE new_ts;
-- QUOTAの変更
ALTER USER test_user QUOTA 1G ON users;
-- プロファイルの変更
ALTER USER test_user PROFILE secure_profile;
-- デフォルトロールの設定
ALTER USER test_user DEFAULT ROLE app_readonly_role;
-- 複数の変更を同時に実行
ALTER USER test_user
IDENTIFIED BY NewPass#2026
DEFAULT TABLESPACE app_data
QUOTA 500M ON app_data
PROFILE secure_profile
ACCOUNT UNLOCK;
ユーザーの削除(DROP USER)
ユーザーを削除するには DROP USER 文を使用します。
SQL
-- オブジェクトを持たないユーザーの削除
DROP USER test_user;
-- オブジェクトを含むユーザーの削除(CASCADE必須)
DROP USER test_user CASCADE;
注意:CASCADE を指定すると、そのユーザーが所有するすべてのオブジェクト(テーブル、ビュー、プロシージャ等)が一緒に削除されます。本番環境では十分注意してください。また、現在接続中のユーザーは削除できません。
ユーザー削除前の確認手順
SQL – 削除前チェック
-- 1. ユーザーが所有するオブジェクトの確認
SELECT object_type, COUNT(*) AS cnt
FROM dba_objects
WHERE owner = 'TEST_USER'
GROUP BY object_type
ORDER BY cnt DESC;
-- 2. アクティブセッションの確認
SELECT sid, serial#, status, program
FROM v$session
WHERE username = 'TEST_USER';
-- 3. 接続中のセッションを強制切断(必要な場合)
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
ユーザー情報の確認(データディクショナリ)
データディクショナリビューを使って、ユーザーに関する情報を確認する方法を解説します。
ユーザー一覧の取得
SQL
-- 全ユーザーの一覧と状態
SELECT username,
account_status,
default_tablespace,
temporary_tablespace,
profile,
created,
expiry_date
FROM dba_users
WHERE oracle_maintained = 'N' -- ユーザー作成分のみ(12c以降)
ORDER BY created DESC;
実行結果例
USERNAME ACCOUNT_STATUS DEFAULT_TABLESPACE PROFILE CREATED
------------ --------------- ------------------- ---------------- -----------
APP_USER OPEN APP_DATA APP_PROFILE 2026-03-01
DEV_USER OPEN USERS DEFAULT 2026-02-15
REPORT_USER EXPIRED USERS SECURE_PROFILE 2026-01-10
QUOTA使用状況の確認
SQL
-- ユーザーのQUOTA使用状況
SELECT tablespace_name,
bytes/1024/1024 AS used_mb,
max_bytes/1024/1024 AS max_mb,
CASE max_bytes
WHEN -1 THEN 'UNLIMITED'
ELSE TO_CHAR(ROUND(bytes/max_bytes*100,1)) || '%'
END AS usage_pct
FROM dba_ts_quotas
WHERE username = 'APP_USER';
ユーザー作成スクリプトの生成
既存ユーザーの設定をスクリプトとして出力する方法です。環境の複製やドキュメント化に便利です。
SQL
-- DBMS_METADATAでユーザーのDDLを取得
SELECT dbms_metadata.get_ddl('USER', 'APP_USER') AS ddl
FROM dual;
実行結果例
CREATE USER "APP_USER" IDENTIFIED BY VALUES 'S:xxxx...'
DEFAULT TABLESPACE "APP_DATA"
TEMPORARY TABLESPACE "TEMP"
PROFILE "APP_PROFILE"
QUOTA 524288000 ON "APP_DATA"
マルチテナント環境(CDB/PDB)でのユーザー管理
Oracle 12c以降のマルチテナント環境では、共通ユーザー(Common User)とローカルユーザー(Local User)の概念があります。
| 種類 |
作成場所 |
命名規則 |
特徴 |
| 共通ユーザー |
CDBルート |
C## プレフィクス必須 |
全PDBで使用可能 |
| ローカルユーザー |
PDB内 |
制限なし |
作成したPDB内のみ |
SQL – CDB/PDBでのユーザー作成
-- CDBルートで共通ユーザーを作成
ALTER SESSION SET container = CDB$ROOT;
CREATE USER C##admin_user
IDENTIFIED BY AdminPass#1
CONTAINER = ALL;
GRANT create session TO C##admin_user CONTAINER = ALL;
-- PDBに切り替えてローカルユーザーを作成
ALTER SESSION SET container = my_pdb;
CREATE USER local_user
IDENTIFIED BY LocalPass#1
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users;
GRANT connect, resource TO local_user;
-- 現在のコンテナを確認
SHOW con_name;
ポイント:Oracle 12c以降では、多くの場合PDB内にローカルユーザーを作成します。共通ユーザーは全PDBを管理する必要があるDBA向けです。非CDB環境(従来型)では、これまで通り C## プレフィクスなしで作成できます。
よくあるエラーと対処法
ユーザー作成・権限付与で発生しやすいエラーとその対処法をまとめます。
| エラーコード |
原因 |
対処法 |
ORA-01017 |
ユーザー名/パスワードが無効 |
ユーザー名・パスワードを確認 |
ORA-01031 |
権限が不足している |
必要なシステム権限をGRANT |
ORA-01045 |
CREATE SESSION権限がない |
GRANT CREATE SESSION |
ORA-01920 |
ユーザー名が既に存在 |
別名を使用 or DROP USER |
ORA-01950 |
表領域のQUOTAが不足 |
ALTER USER ... QUOTA |
ORA-28000 |
アカウントがロックされている |
ALTER USER ... ACCOUNT UNLOCK |
ORA-28001 |
パスワードが期限切れ |
パスワードを変更 |
ORA-65096 |
CDBルートで共通ユーザー名に C## がない |
C## プレフィクスを付ける |
ORA-01045: CREATE SESSION権限がない
ユーザー作成後に最もよく遭遇するエラーです。
エラー再現と対処
-- ユーザーを作成しただけの状態で接続しようとする
CONNECT test_user/MyPassword123
-- ERROR: ORA-01045: user TEST_USER lacks CREATE SESSION privilege
-- 対処:CREATE SESSION権限を付与
GRANT create session TO test_user;
-- 再度接続 → 成功
CONNECT test_user/MyPassword123
-- Connected.
ORA-01950: 表領域のQUOTAが不足
テーブル作成時によく発生するエラーです。
エラー再現と対処
-- QUOTA 0の状態でテーブルを作成しようとする
CREATE TABLE my_table (id NUMBER);
-- ERROR: ORA-01950: no privileges on tablespace 'USERS'
-- 対処1:QUOTAを設定
ALTER USER test_user QUOTA 100M ON users;
-- 対処2:UNLIMITED TABLESPACEを付与
GRANT unlimited tablespace TO test_user;
ORA-28000: アカウントロック
パスワードの連続入力ミスでアカウントがロックされた場合の対処です。
SQL
-- ロック状態の確認
SELECT username, account_status, lock_date
FROM dba_users
WHERE username = 'TEST_USER';
-- アンロック + パスワードリセット
ALTER USER test_user ACCOUNT UNLOCK;
ALTER USER test_user IDENTIFIED BY NewPass#2026;
実務でのベストプラクティス
本番環境でのユーザー管理において、セキュリティと運用効率の両面から守るべきベストプラクティスを解説します。
1. 最小権限の原則(Principle of Least Privilege)
最小権限の原則とは
- ユーザーには業務に必要最小限の権限のみを付与する
DBA ロールや SELECT ANY TABLE のような広範な権限は安易に使わない
- オブジェクト権限は個別テーブル単位で付与する
- 定期的に不要な権限を棚卸し・取り消しする
2. 命名規則の統一
| 用途 |
命名規則の例 |
具体例 |
| スキーマオーナー |
{アプリ名}_OWNER |
APP_OWNER, CRM_OWNER |
| アプリ接続用 |
{アプリ名}_APP |
APP_APP, CRM_APP |
| 読み取り専用 |
{アプリ名}_RO |
APP_RO, CRM_RO |
| バッチ処理用 |
{アプリ名}_BATCH |
APP_BATCH, CRM_BATCH |
| カスタムロール |
ROLE_{用途} |
ROLE_APP_RO, ROLE_APP_RW |
3. パスワードポリシーの設計
SQL – 推奨プロファイル設定
-- 本番環境向けプロファイル
CREATE PROFILE prod_user_profile LIMIT
PASSWORD_LIFE_TIME 90
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME 365
PASSWORD_REUSE_MAX 12
FAILED_LOGIN_ATTEMPTS 5
PASSWORD_LOCK_TIME 1/24
PASSWORD_VERIFY_FUNCTION ora12c_verify_function;
-- アプリケーション用プロファイル(パスワード期限なし)
CREATE PROFILE app_service_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1/24
SESSIONS_PER_USER 50;
注意:アプリケーションの接続ユーザーには PASSWORD_LIFE_TIME = UNLIMITED を設定するのが一般的です。パスワードが期限切れになるとアプリケーションが接続できなくなり、障害の原因になります。
4. 権限の監査
定期的に権限の棚卸しを行い、不要な権限を取り消しましょう。
SQL – 権限監査クエリ
-- DBAロールを持つユーザーの一覧
SELECT grantee
FROM dba_role_privs
WHERE granted_role = 'DBA'
ORDER BY grantee;
-- 強力な権限を持つユーザーの一覧
SELECT grantee, privilege
FROM dba_sys_privs
WHERE privilege IN (
'SELECT ANY TABLE',
'INSERT ANY TABLE',
'UPDATE ANY TABLE',
'DELETE ANY TABLE',
'DROP ANY TABLE'
)
ORDER BY grantee;
-- 長期間ログインしていないユーザーの確認
SELECT username, account_status,
last_login, created
FROM dba_users
WHERE oracle_maintained = 'N'
AND (last_login IS NULL
OR last_login < SYSDATE - 90)
ORDER BY last_login NULLS FIRST;
実務シナリオ:新規プロジェクトのユーザー設計
新規Webアプリケーション「OrderSystem」を構築する際のユーザー設計例を紹介します。
SQL – プロジェクト構築スクリプト
-- ============================================
-- OrderSystem データベースユーザー構築
-- ============================================
-- 1. 表領域の作成
CREATE TABLESPACE order_data
DATAFILE 'order_data01.dbf'
SIZE 1G AUTOEXTEND ON NEXT 200M MAXSIZE 10G;
-- 2. プロファイルの作成
CREATE PROFILE order_app_profile LIMIT
PASSWORD_LIFE_TIME UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
SESSIONS_PER_USER 30;
-- 3. スキーマオーナー
CREATE USER order_owner
IDENTIFIED BY Owner#Secure2026
DEFAULT TABLESPACE order_data
QUOTA UNLIMITED ON order_data;
GRANT connect, resource TO order_owner;
-- 4. ロールの作成
CREATE ROLE order_ro_role;
CREATE ROLE order_rw_role;
-- 5. アプリ接続用ユーザー
CREATE USER order_app
IDENTIFIED BY App#Secure2026
DEFAULT TABLESPACE order_data
QUOTA 500M ON order_data
PROFILE order_app_profile;
GRANT create session TO order_app;
GRANT order_rw_role TO order_app;
-- 6. 読み取り専用ユーザー
CREATE USER order_ro
IDENTIFIED BY ReadOnly#2026
DEFAULT TABLESPACE order_data
QUOTA 0 ON order_data;
GRANT create session TO order_ro;
GRANT order_ro_role TO order_ro;
ポイント:テーブル作成後に GRANT SELECT ON order_owner.orders TO order_ro_role のようにロールへ権限を付与します。ロール経由の権限管理により、新しいテーブルを追加した際もロールへの1行のGRANTで全ユーザーに反映できます。
まとめ
| 項目 |
SQL構文 |
| ユーザー作成 |
CREATE USER ユーザー名 IDENTIFIED BY パスワード |
| 接続権限の付与 |
GRANT CREATE SESSION TO ユーザー名 |
| システム権限の付与 |
GRANT 権限名 TO ユーザー名 |
| オブジェクト権限の付与 |
GRANT 権限 ON スキーマ.テーブル TO ユーザー名 |
| ロールの付与 |
GRANT ロール名 TO ユーザー名 |
| 権限の取り消し |
REVOKE 権限名 FROM ユーザー名 |
| ユーザー変更 |
ALTER USER ユーザー名 IDENTIFIED BY 新パスワード |
| ユーザー削除 |
DROP USER ユーザー名 CASCADE |
| QUOTA設定 |
ALTER USER ユーザー名 QUOTA サイズ ON 表領域 |
| 権限確認 |
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = ... |
Oracleのユーザー管理は、CREATE USER でユーザーを作成し、GRANT で必要な権限を付与するのが基本です。
実務では以下の3点を常に意識しましょう。
ユーザー管理の3原則
- 最小権限の原則:必要最小限の権限のみを付与する
- ロールによる一元管理:権限はロールにまとめ、ユーザーにはロールを付与する
- 定期的な監査:不要な権限やユーザーを定期的に棚卸しする
この記事で解説した手順を活用して、セキュアで効率的なOracleデータベースのユーザー管理を実現してください。