Oracle のプロファイルは、ユーザーごとに パスワードポリシー(有効期限・失敗回数・複雑さ)と リソース制限(CPU・セッション数・接続時間)を一括管理する仕組みです。本記事では、プロファイルの概念から確認 SQL・作成・変更・実務でのベストプラクティスまでを体系的に解説します。
- DBA_PROFILES で全プロファイルの設定を確認する方法
- DBA_USERS で特定ユーザーのプロファイルを確認する方法
- パスワード制限・リソース制限パラメータの意味と設定値
- RESOURCE_LIMIT パラメータの確認・有効化
- プロファイルの作成・変更・ユーザーへの適用
- DEFAULT プロファイルの注意点と確認方法
プロファイルとは
Oracle のプロファイルは、ユーザーに適用できる 設定値の集合(名前付きセット) です。DBA がプロファイルを作成してユーザーに割り当てることで、以下の2種類の制限を一元管理できます。
| 種別 | 制御できる内容 | 代表パラメータ |
|---|---|---|
| パスワード制限 | パスワードの有効期限・試行回数・複雑さ・再利用制限 | FAILED_LOGIN_ATTEMPTS, PASSWORD_LIFE_TIME, PASSWORD_COMPLEXITY_FUNCTION |
| リソース制限 | CPU 使用量・セッション数・接続時間・アイドル時間・読み取りブロック数 | CPU_PER_SESSION, SESSIONS_PER_USER, CONNECT_TIME, IDLE_TIME |
プロファイルを指定しないと、自動的に
DEFAULT プロファイルが適用されます。DEFAULT プロファイルはすべての制限が UNLIMITED なので、本番環境では適切なプロファイルを必ず設定してください。
全プロファイルを確認する:DBA_PROFILES
すべてのプロファイルと設定値を表示
-- 全プロファイルの全設定値を表示 SELECT PROFILE, RESOURCE_NAME, RESOURCE_TYPE, LIMIT FROM DBA_PROFILES ORDER BY PROFILE, RESOURCE_TYPE, RESOURCE_NAME;
パスワード制限のみ抽出
-- パスワード関連パラメータのみ確認 SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE RESOURCE_TYPE = 'PASSWORD' ORDER BY PROFILE, RESOURCE_NAME;
リソース制限のみ抽出
-- リソース制限パラメータのみ確認 SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE RESOURCE_TYPE = 'KERNEL' ORDER BY PROFILE, RESOURCE_NAME;
UNLIMITED・DEFAULT 以外(実際に制限が設定されているもの)を抽出
-- 意味のある制限が設定されているパラメータだけ確認
SELECT
PROFILE,
RESOURCE_TYPE,
RESOURCE_NAME,
LIMIT
FROM DBA_PROFILES
WHERE LIMIT NOT IN ('UNLIMITED', 'DEFAULT')
ORDER BY PROFILE, RESOURCE_TYPE, RESOURCE_NAME;
ユーザーに割り当てられたプロファイルを確認する:DBA_USERS
全ユーザーのプロファイルを一覧表示
-- 全ユーザーのプロファイルとアカウント状態を確認 SELECT USERNAME, PROFILE, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, CREATED FROM DBA_USERS ORDER BY PROFILE, USERNAME;
特定ユーザーのプロファイルを確認
-- 特定ユーザーのプロファイル名を確認 SELECT USERNAME, PROFILE, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS WHERE USERNAME = 'SCOTT'; -- ユーザー名は大文字で指定
ユーザーとプロファイルの詳細設定を結合して確認(実務で使えるSQL)
-- ユーザーに適用されている実際の制限値を一覧表示 SELECT u.USERNAME, u.PROFILE, u.ACCOUNT_STATUS, p.RESOURCE_TYPE, p.RESOURCE_NAME, p.LIMIT FROM DBA_USERS u JOIN DBA_PROFILES p ON u.PROFILE = p.PROFILE WHERE u.USERNAME = 'SCOTT' ORDER BY p.RESOURCE_TYPE, p.RESOURCE_NAME;
特定プロファイルの詳細確認
-- 特定プロファイルの全パラメータを確認 SELECT RESOURCE_TYPE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE PROFILE = 'APP_USER_PROFILE' -- プロファイル名は大文字 ORDER BY RESOURCE_TYPE, RESOURCE_NAME;
DBA_PROFILES の主要カラムと設定値
パスワード制限パラメータ(RESOURCE_TYPE = ‘PASSWORD’)
| パラメータ名 | 意味 | 推奨設定例 |
|---|---|---|
FAILED_LOGIN_ATTEMPTS |
ロックまでの失敗回数 | 5〜10 |
PASSWORD_LIFE_TIME |
パスワードの有効期間(日数) | 90〜180 |
PASSWORD_REUSE_TIME |
同じパスワードを再使用できるまでの日数 | 365 |
PASSWORD_REUSE_MAX |
再使用できるまでに変更が必要な回数 | 10 |
PASSWORD_LOCK_TIME |
ロック後の自動解除までの日数(UNLIMITED = 手動解除) | UNLIMITED |
PASSWORD_GRACE_TIME |
有効期限切れ後のログイン猶予日数 | 7 |
PASSWORD_VERIFY_FUNCTION |
パスワード複雑さチェック関数 | ORA12C_STRONG_VERIFY_FUNCTION |
INACTIVE_ACCOUNT_TIME |
未使用アカウントのロックまでの日数(12c R2 以降) | 30〜60 |
リソース制限パラメータ(RESOURCE_TYPE = ‘KERNEL’)
| パラメータ名 | 意味 | 単位 |
|---|---|---|
SESSIONS_PER_USER |
ユーザーが同時に張れる最大セッション数 | セッション数 |
CPU_PER_SESSION |
1セッションが使用できる最大 CPU 時間 | 100 分の 1 秒 |
CPU_PER_CALL |
1 SQL 呼び出しの最大 CPU 時間 | 100 分の 1 秒 |
CONNECT_TIME |
1セッションの最大接続時間 | 分 |
IDLE_TIME |
アイドル状態で自動切断されるまでの時間 | 分 |
LOGICAL_READS_PER_SESSION |
1セッションの最大ブロック読み取り数 | ブロック数 |
LOGICAL_READS_PER_CALL |
1 SQL 呼び出しの最大ブロック読み取り数 | ブロック数 |
PRIVATE_SGA |
共有サーバーモード時の SGA 割り当て上限 | バイト |
COMPOSITE_LIMIT |
複合リソース制限(上記を加重合計) | サービスユニット |
プロファイルにリソース制限を設定しても、初期化パラメータ
RESOURCE_LIMIT = TRUE になっていないと制限が適用されません。パスワード制限はこのパラメータに関わらず常に有効です。
RESOURCE_LIMIT パラメータの確認と有効化
-- 現在の設定を確認 SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME = 'resource_limit'; -- 有効化(動的変更可能) ALTER SYSTEM SET RESOURCE_LIMIT = TRUE; -- 確認 SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME = 'resource_limit';
DEFAULT プロファイルの確認
Oracle インストール直後に存在するプロファイルです。プロファイル未指定のユーザーには自動的に適用されます。
-- DEFAULT プロファイルの設定を確認 SELECT RESOURCE_NAME, RESOURCE_TYPE, LIMIT FROM DBA_PROFILES WHERE PROFILE = 'DEFAULT' ORDER BY RESOURCE_TYPE, RESOURCE_NAME;
Oracle 12c 以降では DEFAULT プロファイルの
PASSWORD_LIFE_TIME が 180 日 に設定されています(Oracle 11g 以前は UNLIMITED)。接続エラーが発生している場合はパスワード有効期限切れが原因の場合があります。
-- アカウントの状態を確認 SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS WHERE ACCOUNT_STATUS != 'OPEN'; -- パスワードの有効期限を無効化(本番環境では慎重に) ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
プロファイルの作成・変更・削除
プロファイルの作成
-- 業務システム用プロファイルの作成例 CREATE PROFILE app_user_profile LIMIT -- パスワード制限 FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LIFE_TIME 180 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10 PASSWORD_LOCK_TIME UNLIMITED PASSWORD_GRACE_TIME 7 -- リソース制限 SESSIONS_PER_USER 5 CONNECT_TIME 480 IDLE_TIME 60;
既存プロファイルの変更
-- パスワード有効期限を 90 日に変更 ALTER PROFILE app_user_profile LIMIT PASSWORD_LIFE_TIME 90; -- 複数パラメータを同時に変更 ALTER PROFILE app_user_profile LIMIT FAILED_LOGIN_ATTEMPTS 3 IDLE_TIME 30;
ユーザーへのプロファイル割り当て・変更
-- 新規ユーザー作成時にプロファイルを指定 CREATE USER appuser IDENTIFIED BY password PROFILE app_user_profile; -- 既存ユーザーのプロファイルを変更 ALTER USER scott PROFILE app_user_profile; -- 変更後に確認 SELECT USERNAME, PROFILE FROM DBA_USERS WHERE USERNAME = 'SCOTT';
プロファイルの削除
-- プロファイルを削除(ユーザーに割り当てられていない場合) DROP PROFILE app_user_profile; -- CASCADE: 割り当てられているユーザーを DEFAULT プロファイルに変更してから削除 DROP PROFILE app_user_profile CASCADE;
実務でよく使う SQL 集
ロックされているユーザーを一覧表示
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE, PROFILE FROM DBA_USERS WHERE ACCOUNT_STATUS != 'OPEN' ORDER BY ACCOUNT_STATUS, USERNAME;
パスワードが近日中に期限切れになるユーザーを確認
-- 30 日以内に期限切れになるユーザーを抽出 SELECT u.USERNAME, u.PROFILE, u.EXPIRY_DATE, ROUND(u.EXPIRY_DATE - SYSDATE, 1) AS DAYS_REMAINING FROM DBA_USERS u WHERE u.EXPIRY_DATE IS NOT NULL AND u.EXPIRY_DATE <= SYSDATE + 30 AND u.ACCOUNT_STATUS = 'OPEN' ORDER BY u.EXPIRY_DATE;
プロファイルごとに割り当てられているユーザー数を集計
SELECT PROFILE, COUNT(*) AS USER_COUNT FROM DBA_USERS GROUP BY PROFILE ORDER BY USER_COUNT DESC;
DBA・システム権限を持つユーザーのプロファイルを確認
SELECT
u.USERNAME,
u.PROFILE,
u.ACCOUNT_STATUS
FROM DBA_USERS u
WHERE u.USERNAME IN (
SELECT GRANTEE FROM DBA_SYS_PRIVS
WHERE PRIVILEGE IN ('DBA', 'CREATE USER', 'ALTER USER', 'DROP USER')
)
ORDER BY u.USERNAME;
プロファイルの
LOGICAL_READS_PER_SESSION や CPU_PER_SESSION で大量データを扱うクエリを制限できます。ただし TEMP 表領域の不足には別途対処が必要です。詳細は 容量不足の緊急対応完全ガイド(表領域・TEMP・UNDO) を参照してください。
よくある質問(FAQ)
DBA_PROFILES および DBA_USERS を参照するには SELECT ANY DICTIONARY 権限か DBA ロールが必要です。権限が不足している場合は USER_PASSWORD_LIMITS(12c 以降)で自分のプロファイル設定を確認できます。
-- 自分のパスワード制限のみ確認(一般ユーザーでも可) SELECT * FROM USER_PASSWORD_LIMITS; -- 自分が割り当てられているプロファイル名(一般ユーザーでも可) SELECT PROFILE FROM DBA_USERS WHERE USERNAME = USER; -- ※ SELECT_CATALOG_ROLE または SELECT ANY DICTIONARY 権限が必要
LIMIT が DEFAULT の場合は、DEFAULT プロファイルに設定されている値が実際に適用されます。
-- DEFAULT を参照している場合は DEFAULT プロファイルの値が適用される SELECT RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE PROFILE = 'DEFAULT' AND RESOURCE_NAME = 'FAILED_LOGIN_ATTEMPTS';
DBA が ALTER USER でアカウントを解除します。
-- アカウントのロックを解除 ALTER USER scott ACCOUNT UNLOCK; -- 同時にパスワードも変更する場合 ALTER USER scott IDENTIFIED BY new_password ACCOUNT UNLOCK; -- ロック解除後の状態確認 SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE USERNAME = 'SCOTT';
Oracle 12c 以降の DEFAULT プロファイルは PASSWORD_LIFE_TIME = 180 がデフォルト値です。以前は UNLIMITED だったため、アップグレード後に突然エラーが発生するケースがあります。
-- 現在の PASSWORD_LIFE_TIME を確認 SELECT LIMIT FROM DBA_PROFILES WHERE PROFILE = 'DEFAULT' AND RESOURCE_NAME = 'PASSWORD_LIFE_TIME'; -- 期限切れを一時的に解除(暫定対処) ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; -- パスワードをリセット(アカウントを OPEN 状態に戻す) ALTER USER scott IDENTIFIED BY new_password; -- 根本対処: 適切な期限のプロファイルを作成・適用する
接続自体ができない場合は ORA-12560: TNS プロトコル・アダプタ・エラーの解決方法 も確認してください。
プロファイルの変更は 即座に 反映されます。変更後に新しいセッションが開始されたタイミングで新しい制限が適用されます。ただし既存のアクティブセッションには影響しないパラメータがほとんどです(IDLE_TIME など一部は次のチェックポイントで反映されます)。
まとめ
| 目的 | SQL / コマンド |
|---|---|
| 全プロファイル一覧 | SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES ORDER BY PROFILE; |
| 特定ユーザーのプロファイル確認 | SELECT PROFILE FROM DBA_USERS WHERE USERNAME = 'SCOTT'; |
| 特定プロファイルの詳細 | SELECT RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE PROFILE = 'xxx'; |
| ロックユーザー確認 | SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS WHERE ACCOUNT_STATUS != 'OPEN'; |
| アカウントロック解除 | ALTER USER scott ACCOUNT UNLOCK; |
| プロファイル作成 | CREATE PROFILE xxx LIMIT FAILED_LOGIN_ATTEMPTS 5 ...; |
| ユーザーへのプロファイル変更 | ALTER USER scott PROFILE xxx; |
| RESOURCE_LIMIT 有効化 | ALTER SYSTEM SET RESOURCE_LIMIT = TRUE; |
プロファイルの TEMP 表領域制限と合わせて、容量が大きいテーブルを探す方法(DBA_SEGMENTS・SQL完全ガイド) でデータ量の多いテーブルを特定しておくと、リソース制限の適切な閾値を判断しやすくなります。