【Oracle】新規ユーザー作成と権限付与の完全ガイド|CREATE USER・GRANT文の基本から実務活用まで

【Oracle】新規ユーザー作成の手順と権限付与の方法 Oracle

Oracleデータベースで新しいユーザーを作成して権限を付与する方法を知りたいと思ったことはありませんか?

ユーザー管理はOracle DBAの最も基本的かつ重要な業務のひとつです。適切なユーザー作成と権限設定を行わないと、セキュリティリスク運用トラブルの原因になります。

この記事では、CREATE USER文の基本構文から、表領域・プロファイルの指定システム権限・オブジェクト権限の付与ロールの活用ユーザーの変更・削除マルチテナント環境(CDB/PDB)での操作トラブルシューティングまで、実務で必要な知識を網羅的に解説します。

スポンサーリンク
  1. ユーザー作成の前提知識
    1. ユーザーを作成できる条件
  2. CREATE USERの基本構文
    1. 最もシンプルなユーザー作成
    2. 各オプションの詳細
  3. 実務でよく使うユーザー作成パターン
    1. パターン1:開発用ユーザー
    2. パターン2:アプリケーション接続用ユーザー
    3. パターン3:読み取り専用ユーザー
    4. パターン4:初回ログイン時にパスワード変更を強制
  4. 表領域(TABLESPACE)の設定
    1. DEFAULT TABLESPACEとは
    2. QUOTA(使用量制限)の設定
  5. 認証方式の種類
  6. プロファイル(PROFILE)の設定
    1. カスタムプロファイルの作成
    2. DEFAULTプロファイルの確認
  7. パスワード管理
    1. パスワードの変更
    2. アカウントのロック/アンロック
  8. GRANT文の基本構文
  9. システム権限の付与
    1. よく使うシステム権限一覧
  10. オブジェクト権限の付与
    1. オブジェクト権限の種類
    2. オブジェクト権限の付与例
  11. ロール(ROLE)の活用
    1. Oracleの定義済みロール
    2. カスタムロールの作成
  12. 権限の取り消し(REVOKE)
  13. 権限とロールの確認方法
    1. 付与されたシステム権限の確認
    2. 権限確認に使える主要ビュー
  14. ユーザーの変更(ALTER USER)
  15. ユーザーの削除(DROP USER)
    1. ユーザー削除前の確認手順
  16. ユーザー情報の確認(データディクショナリ)
    1. ユーザー一覧の取得
    2. QUOTA使用状況の確認
    3. ユーザー作成スクリプトの生成
  17. マルチテナント環境(CDB/PDB)でのユーザー管理
  18. よくあるエラーと対処法
    1. ORA-01045: CREATE SESSION権限がない
    2. ORA-01950: 表領域のQUOTAが不足
    3. ORA-28000: アカウントロック
  19. 実務でのベストプラクティス
    1. 1. 最小権限の原則(Principle of Least Privilege)
    2. 2. 命名規則の統一
    3. 3. パスワードポリシーの設計
    4. 4. 権限の監査
  20. 実務シナリオ:新規プロジェクトのユーザー設計
  21. まとめ

ユーザー作成の前提知識

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;

実行結果

User created.

これだけでユーザーは作成されますが、この状態ではデータベースに接続すらできません。接続するには 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_roleapp_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データベースのユーザー管理を実現してください。