Oracleの権限不足を調べるSQL一覧|直接付与・ロール・セッションの確認方法
まず押さえたいOracle権限確認の結論
Oracleの権限不足を調べるときは、直接付与された権限、ロール経由の権限、現在のセッションで有効な権限を分けて確認します。
権限があるように見えても実際の操作でエラーになる場合は、付与経路や接続中のセッション状態が想定と異なっている可能性があります。
最初からすべてのビューを確認するのではなく、失敗した操作に必要な権限を整理してから調査を進めることが重要です。
1つのビューだけでは権限全体を確認できない
Oracleには、データベース全体の操作に関わるシステム権限と、表やビューに対するオブジェクト権限があります。
権限はユーザーへ直接付与される場合と、ロールを通じて付与される場合があります。
USER_SYS_PRIVSだけではロール経由やセッションで有効な権限まで確認できないため、複数のビューを組み合わせます。
たとえばCREATE TABLEはシステム権限ですが、別スキーマの表を参照するSELECTはオブジェクト権限として確認します。
ユーザーにロールが付与されていても、そのロールに目的の権限が含まれていなければ操作は成功しません。
ロールに権限が含まれていても、現在のセッションでそのロールが有効でなければ利用できない場合があります。
この違いを理解しておくと、確認SQLの結果が想定と異なる場合でも次に調べる場所を判断しやすくなります。
調査前に確認する3つの情報
最初に確認するのは、SQLを実行したユーザー、失敗した操作、対象オブジェクトの所有者です。
SELECT SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’) FROM DUAL;
対象がSALES.ORDERSなのか、シノニムORDERSが指す別オブジェクトなのかでも調査先が変わります。
エラー内容、実行SQL、接続先も控えておくと、管理者へ状況を伝えやすくなります。
実行ユーザーが想定と異なる場合は、正しいユーザーへ権限を付与していてもエラーは解消しません。
対象オブジェクトの所有者が異なる場合は、自分のスキーマにある同名オブジェクトの権限を確認しても原因を特定できません。
SELECTやINSERTなどの操作内容によって必要な権限が変わるため、失敗したSQLを省略せずに確認します。
ORA-01031のようなエラー番号だけでなく、どの処理のどの位置で発生したかも記録しておくと切り分けに役立ちます。
Oracleの権限確認ビュー早見表
確認したい内容を先に決めると、使用するビューと次の調査先を選びやすくなります。
各ビューは確認範囲が異なるため、名称が似ていても同じ情報が表示されるとは限りません。
まず早見表で確認先を選び、結果が見つからない場合に関連するビューへ進むと効率的です。
USER系・ROLE系・SESSION系・DBA系の違い
USER系ビューは現在のユーザーに関係する権限を確認するときに使います。
ROLE系ビューはロールに含まれるシステム権限やオブジェクト権限を調べるときに使います。
SESSION系ビューは現在の接続で有効な権限やロールを確認するときに使います。
DBA系ビューは他ユーザーを含むデータベース全体の付与状況を確認するときに使います。
一般ユーザーではDBA系ビューを参照できない場合があるため、表示できないこと自体を異常と判断しません。
自分の権限を調べる場合はUSER系とSESSION系から始め、他ユーザーの状態が必要になった時点で管理者へ確認を依頼します。
ROLE系ビューを利用できる範囲も環境や付与されている権限によって異なるため、参照できない場合はDBAへ相談します。
直接付与・ロール経由・現在有効の違い
直接付与はユーザー自身へGRANTされた権限であり、USER_SYS_PRIVSやUSER_TAB_PRIVSで確認します。
ロール経由はUSER_ROLE_PRIVSでロール名を確認し、ROLE_SYS_PRIVSやROLE_TAB_PRIVSで内部を追います。
現在有効な状態はSESSION_PRIVSやSESSION_ROLESで確認します。
直接付与された権限は、ユーザーと権限の関係を確認しやすい点が特徴です。
ロール経由の権限は複数のユーザーをまとめて管理しやすい一方で、確認時にはロールの内部まで追う必要があります。
現在有効な権限は接続中のセッションを基準にするため、付与状況だけでは分からない実行時の状態を確認できます。
| 確認したい内容 | 主に使うビュー | 確認できる範囲 | 次の確認先 |
|---|---|---|---|
| 直接付与されたシステム権限 | USER_SYS_PRIVS | 現在のユーザーへ直接付与されたシステム権限 | USER_ROLE_PRIVS、SESSION_PRIVS |
| オブジェクト権限 | USER_TAB_PRIVS | 現在のユーザーに関係する表やビューなどの権限 | ROLE_TAB_PRIVS、DBA_TAB_PRIVS |
| 付与されたロール | USER_ROLE_PRIVS | 現在のユーザーへ付与されたロール | ROLE_SYS_PRIVS、ROLE_TAB_PRIVS |
| 現在有効なシステム権限 | SESSION_PRIVS | 現在のセッションで利用できるシステム権限 | USER_SYS_PRIVS、SESSION_ROLES |
| 現在有効なロール | SESSION_ROLES | 現在のセッションで有効なロール | USER_ROLE_PRIVS |
| 他ユーザーの付与状況 | DBA系ビュー | データベース内のユーザーやロールの権限 | 管理者による確認 |
早見表は確認を始める場所を決めるためのものであり、1つのビューだけで調査を終了するものではありません。
表示された結果と実際のエラー状況が一致しない場合は、付与経路、セッション、対象オブジェクトの順に範囲を広げます。
USER_SYS_PRIVSで直接付与されたシステム権限を確認する
USER_SYS_PRIVSは、現在のユーザーへ直接付与されたシステム権限を確認するビューです。
接続、表の作成、ユーザーの作成など、データベースやスキーマ単位の操作に関係する権限を調査するときに使用します。
このビューに表示されるのは直接付与されたシステム権限であり、ロール経由の権限とは分けて考えます。
USER_SYS_PRIVSの基本確認SQL
基本SQLでは、権限名とADMIN OPTIONの有無を一覧にします。
SELECT USERNAME, PRIVILEGE, ADMIN_OPTION FROM USER_SYS_PRIVS ORDER BY PRIVILEGE;
PRIVILEGE列にはCREATE SESSIONやCREATE TABLEなどのシステム権限名が表示されます。
0件でもロール経由で利用できる場合があるため、USER_SYS_PRIVSだけで権限がないと断定しません。
USERNAME列は確認対象となっている現在のユーザーを判断するために利用できます。
結果を保存しておくと、権限付与の前後や別環境との違いを比較しやすくなります。
権限数が多い場合は一覧を目視するだけでなく、必要な権限名を条件に指定します。
権限名を指定して絞り込むSQL
確認したい権限が決まっている場合は、PRIVILEGE列で絞り込みます。
SELECT PRIVILEGE, ADMIN_OPTION FROM USER_SYS_PRIVS WHERE PRIVILEGE IN (‘CREATE SESSION’, ‘CREATE TABLE’) ORDER BY PRIVILEGE;
CREATE SESSIONは接続に関係し、CREATE TABLEは自分のスキーマでの表作成に関係します。
別スキーマでの操作には別の権限が必要になるため、実行した操作を具体的に整理します。
権限名は通常大文字で表示されるため、条件値も大文字で指定すると確認しやすくなります。
CREATE VIEWやCREATE PROCEDUREなどを調べる場合も、同じ形式でPRIVILEGE列を絞り込みます。
必要な権限名が分からない場合は、最初に一覧を取得してから操作内容と照合します。
ANYを含む強い権限が表示された場合でも、すぐに追加付与の判断をせず、実際に必要な範囲を管理者と確認します。
ADMIN_OPTIONの意味
ADMIN_OPTIONがYESなら、そのシステム権限をほかのユーザーやロールへ付与できます。
NOでも権限自体を利用できないという意味ではありません。
ADMIN_OPTIONは権限を再付与できるかを表すため、対象操作を実行できるかという確認とは分けて読み取ります。
権限不足エラーの調査では、まずPRIVILEGE列に必要な権限があるかを優先して確認します。
CDBやPDBの環境ではCOMMONやINHERITEDも手がかりになりますが、利用可能な列は実環境で確認します。
共通ユーザーやローカルユーザーが混在する環境では、接続中のコンテナも合わせて確認します。
列の構成が想定と異なる場合は、利用しているOracle Databaseのバージョンに対応したデータ・ディクショナリを確認します。
USER_TAB_PRIVSでオブジェクト権限を確認する
USER_TAB_PRIVSは、表やビューなどに対するSELECT、INSERT、UPDATE、DELETEなどの権限を確認するときに使います。
別スキーマの表を参照できない場合や、更新処理だけが失敗する場合は、オブジェクト権限の確認が重要です。
同じオブジェクトでも操作ごとに必要な権限が異なるため、SELECTできることだけでINSERTやUPDATEも可能だとは判断できません。
USER_TAB_PRIVSが表示する権限の範囲
USER_TAB_PRIVSには、現在のユーザーが所有者、付与者、付与先として関係するオブジェクト権限が表示されます。
自分が所有する表では、自分自身へのSELECT権限が明示的に表示されるとは限りません。
ロール経由の権限も別に確認する必要があるため、結果が0件でも異常と決めつけません。
現在のユーザーが対象オブジェクトとどのような関係にあるかによって、表示される行が変わります。
付与先として確認したい場合は、GRANTEE列が現在のユーザーや関連する対象になっているかを確認します。
確認範囲を誤解すると、表示されない権限を存在しないと判断してしまうため注意が必要です。
OWNERとTABLE_NAMEを指定して確認するSQL
USER_TAB_PRIVSでは一般的にTABLE_SCHEMAとTABLE_NAMEを使って対象を絞り込みます。
SELECT GRANTOR, GRANTEE, TABLE_SCHEMA, TABLE_NAME, PRIVILEGE, GRANTABLE FROM USER_TAB_PRIVS WHERE TABLE_SCHEMA = ‘SALES’ AND TABLE_NAME = ‘ORDERS’ ORDER BY PRIVILEGE;
同名オブジェクトの取り違えを防ぐため、スキーマ名も確認します。
TABLE_NAMEだけで検索すると、別スキーマにある同名の表やビューが混在する可能性があります。
対象名が不明確な場合は、ALL_OBJECTSでオブジェクトの所有者と種類を確認してから絞り込みます。
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE OBJECT_NAME = ‘ORDERS’ ORDER BY OWNER, OBJECT_TYPE;
表ではなくビューやマテリアライズド・ビューを参照している場合もあるため、OBJECT_TYPEを確認します。
GRANTORとGRANTABLEの確認方法
GRANTORは権限の付与者、GRANTEEは権限の付与先を示します。
PRIVILEGEにはSELECTやINSERTなどの権限名が表示されます。
GRANTABLEは、そのオブジェクト権限を別のユーザーやロールへ再付与できるかを示します。
GRANTABLEがNOでも、表示されている権限を利用できないという意味ではありません。
権限不足を調べる場合は、必要な操作とPRIVILEGE列の値が一致しているかを確認します。
SELECT権限しかないユーザーがUPDATEを実行すると失敗するため、操作単位で照合します。
0件でも異常とは限らない理由
0件になる原因には、所有オブジェクト、ロール経由、検索条件の不一致があります。
シノニムを使う場合は、入力名と実際のOWNERやTABLE_NAMEが異なる可能性があります。
SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME FROM ALL_SYNONYMS WHERE SYNONYM_NAME = ‘ORDERS’;
結果がないときは、対象の実体、付与先、ロール、接続ユーザーの順に確認します。
検索条件の大文字小文字が一致していない場合も、対象行が見つからないことがあります。
自分の所有オブジェクトを操作している場合は、明示的なGRANTがなくても所有者として操作できるため、USER_TAB_PRIVSの行だけでは判断できません。
ロール経由で権限を得ている場合は、ROLE_TAB_PRIVSや現在有効なロールを確認します。
一般ユーザーから見えない付与状況が疑われる場合は、DBA_TAB_PRIVSを参照できる管理者へ確認を依頼します。
ロール経由で付与された権限を確認する
ロール経由の権限は、付与されたロール名と、その内部に含まれる権限を分けて確認します。
ロールは複数の権限をまとめて管理できる便利な仕組みですが、名前だけでは含まれる権限を判断できません。
USER_ROLE_PRIVSでロールを確認した後に、ROLE_SYS_PRIVSやROLE_TAB_PRIVSで目的の権限を探します。
USER_ROLE_PRIVSで付与ロールを確認する
USER_ROLE_PRIVSは、現在のユーザーへ付与されたロールを確認するビューです。
SELECT USERNAME, GRANTED_ROLE, ADMIN_OPTION, DEFAULT_ROLE FROM USER_ROLE_PRIVS ORDER BY GRANTED_ROLE;
GRANTED_ROLEはロール名、DEFAULT_ROLEは通常のログイン時に既定で有効になる対象を示します。
ADMIN_OPTIONがYESなら、そのロールを別のユーザーやロールへ付与できます。
ロール名が一覧に表示されても、必要なシステム権限やオブジェクト権限が含まれているとは限りません。
DEFAULT_ROLEがNOの場合は、付与されていてもログイン時に自動で有効にならない可能性があります。
付与ロールの一覧を確認したら、目的の操作に関係しそうなロールの内容を個別に確認します。
ROLE_SYS_PRIVSでロール内のシステム権限を確認する
ROLE_SYS_PRIVSは、アクセス可能なロールに付与されたシステム権限を確認するビューです。
SELECT ROLE, PRIVILEGE, ADMIN_OPTION FROM ROLE_SYS_PRIVS ORDER BY ROLE, PRIVILEGE;
SELECT ROLE, PRIVILEGE FROM ROLE_SYS_PRIVS WHERE ROLE = ‘APP_ROLE’ ORDER BY PRIVILEGE;
ロール名から内容を推測せず、PRIVILEGE列を確認します。
複数のロールが付与されている場合は、ROLE列とPRIVILEGE列を組み合わせて必要な権限を探します。
SELECT ROLE, PRIVILEGE FROM ROLE_SYS_PRIVS WHERE PRIVILEGE = ‘CREATE TABLE’ ORDER BY ROLE;
必要な権限がどのロールに含まれるか分かれば、USER_ROLE_PRIVSとSESSION_ROLESの結果を照合できます。
目的の権限がどのロールにも表示されない場合は、直接付与の不足や別の権限が必要な可能性を確認します。
ROLE_TAB_PRIVSでロール内のオブジェクト権限を確認する
ROLE_TAB_PRIVSは、アクセス可能なロールに付与されたオブジェクト権限を確認するビューです。
SELECT ROLE, OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE FROM ROLE_TAB_PRIVS ORDER BY ROLE, OWNER, TABLE_NAME, PRIVILEGE;
SELECT ROLE, OWNER, TABLE_NAME, PRIVILEGE FROM ROLE_TAB_PRIVS WHERE ROLE = ‘APP_ROLE’ AND OWNER = ‘SALES’ AND TABLE_NAME = ‘ORDERS’ ORDER BY PRIVILEGE;
必要なSELECT権限が表示されなければ、ロールがあっても対象表を参照できません。
OWNERを指定せずTABLE_NAMEだけで検索すると、別スキーマの同名オブジェクトと混同する可能性があります。
SELECTは含まれていてもUPDATEが含まれていなければ、参照は成功しても更新は失敗します。
ROLE列を条件にしない検索も行うと、別の付与済みロールに必要な権限が含まれているか確認できます。
SELECT ROLE, OWNER, TABLE_NAME, PRIVILEGE FROM ROLE_TAB_PRIVS WHERE OWNER = ‘SALES’ AND TABLE_NAME = ‘ORDERS’ ORDER BY ROLE, PRIVILEGE;
ロール名があるだけでは判断できない理由
USER_ROLE_PRIVSだけで調査を終えると、ロール名は正しいのに実行できない原因を見落とします。
ROLE_SYS_PRIVSまたはROLE_TAB_PRIVSで必要な権限を確認し、SESSION_ROLESで現在有効かも確認します。
実際の調査では、用途に合いそうなロールが付与されていても、その内部に必要な権限が含まれていないケースがあります。
ロールの名称がAPP_READやAPP_ADMINでも、具体的な権限構成は環境ごとに異なります。
ロール名ではなく、必要な権限、対象OWNER、対象オブジェクトを条件にして確認することが大切です。
ロールが別のロールへ付与されている階層構造では、管理者による追加確認が必要になる場合があります。
SESSION_PRIVSとSESSION_ROLESで現在有効な権限を確認する
この2つのビューを使うと、付与済みの権限と現在の接続で利用可能な状態を切り分けられます。
権限が付与されていることと、現在のセッションで使えることは同じとは限りません。
付与状況に問題がない場合は、セッション側の有効状態や接続先を確認します。
SESSION_PRIVSで有効なシステム権限を確認する
SESSION_PRIVSには、現在のセッションで利用できるシステム権限が表示されます。
SELECT PRIVILEGE FROM SESSION_PRIVS ORDER BY PRIVILEGE;
USER_SYS_PRIVSは直接付与を示し、SESSION_PRIVSは現在利用可能な状態を示します。
SELECT PRIVILEGE FROM SESSION_PRIVS WHERE PRIVILEGE = ‘CREATE TABLE’;
USER_SYS_PRIVSにない権限がSESSION_PRIVSにある場合は、ロールなどを通じて利用可能になっている可能性があります。
反対に必要な権限がSESSION_PRIVSに表示されない場合は、付与経路や有効なロールを確認します。
結果をUSER_SYS_PRIVSと比較すると、直接付与とそれ以外の経路を切り分けやすくなります。
SESSION_ROLESで有効なロールを確認する
SESSION_ROLESには、現在のセッションで有効なロールが表示されます。
SELECT ROLE FROM SESSION_ROLES ORDER BY ROLE;
USER_ROLE_PRIVSにあるロールがSESSION_ROLESにない場合は、付与済みでも現在は無効な可能性があります。
必要な権限を含むロールが表示されているかを、ROLE_SYS_PRIVSやROLE_TAB_PRIVSの結果と照合します。
ロール名がSESSION_ROLESに表示されても、その内部に目的の権限がなければ操作できません。
付与状況、有効状態、ロール内部の3点を組み合わせて判断します。
付与直後に結果が変わらない場合の確認点
権限付与後も結果が変わらない場合は、現在のユーザー、接続先、PDBを確認します。
SELECT SYS_CONTEXT(‘USERENV’, ‘DB_NAME’), SYS_CONTEXT(‘USERENV’, ‘CON_NAME’), SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’) FROM DUAL;
再接続後も変わらなければ、付与先やコンテナを管理者と確認します。
別の接続プールやアプリケーションセッションが古い接続を保持している場合は、操作しているセッションが切り替わっていない可能性があります。
SQLクライアントで確認した結果とアプリケーションの実行結果が異なる場合は、それぞれの接続ユーザーと接続先を比較します。
同じユーザー名でも異なるデータベースやPDBへ接続していれば、権限の状態は一致しません。
権限を追加する前に、付与対象と実際の接続先が一致していることを確認します。
Oracleの権限不足エラーを順番に切り分ける
ORA-01031などの権限不足エラーでは、確認順序を固定すると見落としを減らせます。
最初に実行環境を確定し、その後に直接付与、ロール経由、セッション状態の順で確認します。
権限を追加することから始めるのではなく、どの段階で想定と異なるかを特定することが重要です。
実行ユーザーと現在の接続先を確認する
最初に、SQLを実行しているユーザーと接続先を確認します。
SELECT SYS_CONTEXT(‘USERENV’, ‘SESSION_USER’), SYS_CONTEXT(‘USERENV’, ‘CURRENT_USER’), SYS_CONTEXT(‘USERENV’, ‘DB_NAME’), SYS_CONTEXT(‘USERENV’, ‘CON_NAME’) FROM DUAL;
想定したユーザーやPDBと異なる場合は、権限ビューを調べる前に接続設定を確認します。
SESSION_USERはログインしたユーザーを確認する手がかりになります。
CURRENT_USERは実行コンテキストによってSESSION_USERと異なる場合があるため、PL/SQLを含む調査で役立ちます。
SQLクライアントとアプリケーションで異なる接続情報を使用している場合は、それぞれで同じSQLを実行して比較します。
対象オブジェクトのOWNERを確認する
次に、対象となる表、ビュー、シーケンス、プロシージャなどの所有者を確認します。
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE OBJECT_NAME = ‘ORDERS’ ORDER BY OWNER, OBJECT_TYPE;
同名オブジェクトやシノニムがある場合は、実体のOWNERとOBJECT_NAMEを特定します。
SQLにスキーマ名が付いていない場合は、現在のスキーマにあるオブジェクトやシノニムが参照される可能性があります。
SELECT SYS_CONTEXT(‘USERENV’, ‘CURRENT_SCHEMA’) FROM DUAL;
CURRENT_SCHEMAが想定と異なる場合は、権限だけでなく名前解決の結果も確認します。
対象がビューの場合は、ビューの参照先や実行方式によって必要な権限が変わる可能性があるため、管理者や開発担当者へ確認します。
必要な権限の種類を判断する
接続や表作成はシステム権限、別スキーマの表参照はオブジェクト権限が基本です。
プロシージャやパッケージの実行では、対象に対するEXECUTE権限が関係します。
必要な権限が不明なら、エラーが発生したSQLと対象を管理者へ共有します。
SELECT、INSERT、UPDATE、DELETEはそれぞれ別のオブジェクト権限として管理されます。
シーケンスから値を取得する場合やプロシージャを実行する場合は、表のSELECT権限だけでは足りません。
DDLを実行する処理では、対象スキーマや操作内容によってシステム権限が関係します。
強いANY権限で解決しようとせず、失敗した操作に必要な最小範囲を確認します。
直接付与された権限を確認する
システム権限はUSER_SYS_PRIVS、オブジェクト権限はUSER_TAB_PRIVSで確認します。
見つからなければロール経由を調べます。
必要な権限が表示された場合は、権限名、対象OWNER、対象オブジェクト、付与先が一致しているかを確認します。
似た名称の権限や別オブジェクトへの権限を見て、条件を満たしていると誤判断しないようにします。
PL/SQL内で失敗している場合は、ロール経由ではなく直接付与が必要になるケースも考慮します。
ロール経由の権限を追跡する
USER_ROLE_PRIVSでロールを確認し、ROLE_SYS_PRIVSまたはROLE_TAB_PRIVSで内部を追います。
必要な権限が見つかったら、SESSION_ROLESで現在有効かを確認します。
複数のロールが付与されている場合は、ロール名ごとに内容を調べるより、必要な権限や対象オブジェクトから検索すると効率的です。
ロール内に必要な権限がない場合は、ロール名が目的に合っているように見えても原因は解消しません。
ロール階層や参照範囲が複雑な場合は、DBA_ROLE_PRIVSを確認できる管理者へ調査を依頼します。
現在のセッションで有効か確認する
SESSION_PRIVSで必要なシステム権限が利用可能かを確認します。
SESSION_ROLESでは、必要な権限を含むロールが有効かを確認します。
付与済みロールが無効な場合は、現在の接続で利用できない理由を管理者と確認します。
接続を変更した直後や権限付与後は、確認対象が新しいセッションになっているかを確認します。
アプリケーションでは接続プールが使われる場合があるため、SQLクライアントの結果だけで判断しないことが重要です。
確認結果別の次の行動
結果を整理すると、次に実行するSQLや依頼先を判断しやすくなります。
| 確認結果 | 考えられる原因 | 次に確認する内容 | 主な対応 |
|---|---|---|---|
| USER_SYS_PRIVSに必要な権限がない | 直接付与されていない | USER_ROLE_PRIVS、ROLE_SYS_PRIVS | ロール経由を確認する |
| USER_TAB_PRIVSに対象権限がない | 対象違い、ロール経由、未付与 | ALL_OBJECTS、ALL_SYNONYMS、ROLE_TAB_PRIVS | 実体と付与経路を確認する |
| USER_ROLE_PRIVSにロールはある | ロール内部に権限がない | ROLE_SYS_PRIVS、ROLE_TAB_PRIVS | 内部の権限を確認する |
| SESSION_ROLESに必要なロールがない | 現在のセッションで無効 | DEFAULT_ROLE、接続状態 | 管理者へ有効状態を確認する |
| SESSION_PRIVSに権限がない | 付与経路が現在有効でない | USER_SYS_PRIVS、SESSION_ROLES | 直接付与とロールを再確認する |
| 権限はあるが別スキーマで失敗する | OWNERや参照先が異なる | ALL_OBJECTS、ALL_SYNONYMS | 正しい対象を確認する |
| 権限はあるがPL/SQLで失敗する | 直接付与や実行方式の問題 | 直接付与、AUTHID、所有者 | 開発担当者とDBAへ確認する |
| 他ユーザーの状況が見えない | 参照権限がない | DBA系ビュー | 管理者へ依頼する |
確認結果を管理者へ伝えるときは、表示された行だけでなく、0件だったビューも記録します。
調査した順序を残すと、同じSQLを繰り返すことを避けられます。
他のユーザーの権限をDBA系ビューで確認する
他ユーザーの権限は、必要な参照権限を持つ管理者がDBA系ビューで確認します。
一般ユーザー向けのUSER系ビューだけでは、別ユーザーに対する付与状況を網羅的に確認できません。
管理者へ依頼する場合は、対象ユーザーと必要な権限を明確に伝えます。
DBA_SYS_PRIVS・DBA_TAB_PRIVS・DBA_ROLE_PRIVSの違い
DBA_SYS_PRIVSはシステム権限、DBA_TAB_PRIVSはオブジェクト権限、DBA_ROLE_PRIVSはロールの付与状況を確認します。
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION FROM DBA_SYS_PRIVS WHERE GRANTEE = ‘APP_USER’ ORDER BY PRIVILEGE;
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS WHERE GRANTEE = ‘APP_USER’ ORDER BY OWNER, TABLE_NAME, PRIVILEGE;
SELECT GRANTEE, GRANTED_ROLE, DEFAULT_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = ‘APP_USER’ ORDER BY GRANTED_ROLE;
GRANTEEにはユーザーだけでなくロールが表示される場合があるため、確認対象を明確にして条件を指定します。
DBA_ROLE_PRIVSでロールを確認した後は、そのロールに含まれる権限も合わせて調べます。
| 現在のユーザー向け | 管理者向け | 主な確認内容 |
|---|---|---|
| USER_SYS_PRIVS | DBA_SYS_PRIVS | システム権限 |
| USER_TAB_PRIVS | DBA_TAB_PRIVS | オブジェクト権限 |
| USER_ROLE_PRIVS | DBA_ROLE_PRIVS | ロールの付与状況 |
DBA系ビューの結果は情報量が多いため、GRANTEE、OWNER、TABLE_NAME、PRIVILEGEなどで範囲を絞ります。
本番環境では必要以上の情報を取得せず、運用ルールに従って確認します。
DBA系ビューを参照できない場合の対応
接続ユーザー、接続先、対象OWNER、実行SQL、エラー、確認済みの結果を整理してDBAへ依頼します。
USER_SYS_PRIVSやUSER_TAB_PRIVSなどで取得した結果を添えると、管理者が追加調査を始めやすくなります。
「権限がありません」とだけ伝えるのではなく、失敗した操作と必要だと考えている権限を明記します。
接続しているデータベース名やPDBも共有すると、別環境のユーザーを調べる誤りを防げます。
権限の追加を依頼する場合も、広い権限ではなく対象オブジェクトと操作を指定します。
権限確認で見落としやすい注意点
権限一覧だけでなく、参照先、実行方法、接続環境も合わせて確認する必要があります。
ビューに必要な権限が表示されていても、実際のSQLが別のオブジェクトや別のユーザーで実行されていればエラーは解消しません。
調査では権限の有無だけでなく、どこでどのように使われているかを確認します。
別スキーマとシノニムを確認する
スキーマ名がないSQLでは、シノニムや同名オブジェクトが参照先を変えることがあります。
ALL_OBJECTSとALL_SYNONYMSを使い、実際のOWNERとOBJECT_NAMEを確認します。
アプリケーションがORDERSを参照していても、実体がSALES.ORDERSとは限りません。
プライベート・シノニムとパブリック・シノニムが関係する環境では、どの名前が解決されているかを管理者と確認します。
権限を確認するときは、SQLに書かれた名前ではなく、最終的に参照されるオブジェクトを基準にします。
大文字小文字と引用符付き識別子を確認する
通常の識別子はデータ・ディクショナリで大文字として扱われるため、検索条件も大文字にそろえます。
引用符付きで作成された名前では、実際の表記と一致する条件が必要です。
0件のときは権限不足だけでなく、検索文字列の不一致も疑います。
アプリケーション上の表示名とデータ・ディクショナリ上の名前が異なる場合もあります。
対象名が不確かな場合は、完全一致だけでなく候補を一覧にして確認します。
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM ALL_OBJECTS WHERE UPPER(OBJECT_NAME) = UPPER(‘Orders’) ORDER BY OWNER, OBJECT_TYPE;
引用符付き識別子を利用している環境では、大文字へ変換した条件だけで見つからない可能性があります。
PL/SQLでは直接付与が必要になる場合がある
定義者権限で実行されるストアドプログラムでは、ロールが権限チェックに使われないケースがあります。
クライアントから直接実行できてもPL/SQL内で失敗する場合は、所有者への直接付与を確認します。
広いANY権限を安易に付与せず、必要な権限を開発担当者とDBAで確認します。
プロシージャやパッケージの所有者と、呼び出しているユーザーを分けて整理します。
実行時権限の違いを確認するため、対象プログラムのAUTHID設定も調査対象になります。
単純なSELECT文が成功することだけで、ストアドプログラム内でも同じ権限が使えるとは判断できません。
CDB・PDBと接続先を確認する
マルチテナント環境では、権限を付与したコンテナとアプリケーションの接続先が一致しているかを確認します。
SELECT SYS_CONTEXT(‘USERENV’, ‘CON_NAME’) FROM DUAL;
COMMONやINHERITEDが利用できる環境では、共通付与かローカル付与かを判断する手がかりになります。
CDBで確認した結果とPDBで確認した結果が異なる場合は、同じユーザー名でも適用範囲が異なる可能性があります。
接続サービス名が想定したPDBを指しているかも確認します。
環境ごとの権限設計を推測で判断せず、データベース管理者が定めた運用ルールに従います。
1本のSQLだけで全権限を判断しない
権限の種類、付与経路、セッション状態が分かれているため、1本のSQLですべてを正確に判断するのは困難です。
UNIONで一覧化する場合も、直接付与とロール経由を区別できる列を残します。
結果を1つの一覧にまとめると確認しやすくなりますが、元のビューが持つ意味を失わないようにします。
同じ権限名が複数の経路から表示される場合もあるため、重複を削除するだけでは付与経路を把握できません。
トラブル調査では、見やすさよりも権限の種類、付与元、現在の有効状態を追跡できることを優先します。
一般ユーザーだけでは確認できない範囲
一般ユーザーは、他ユーザーの全権限や複雑なロール階層を確認できない場合があります。
確認できない情報を推測せず、USER系とSESSION系の結果を保存してDBAへ依頼します。
DBA系ビューを参照するためだけに強い権限を追加することは、セキュリティ上の影響を伴います。
一時的な調査であっても、組織の権限管理手順を守る必要があります。
一般ユーザーで確認できる範囲と、管理者にしか確認できない範囲を分けると、不要な権限追加を避けられます。
Oracleの権限確認でよくある質問
権限確認で迷いやすい点を、次の調査先とともに整理します。
FAQの答えだけで判断せず、実際のユーザー、接続先、対象オブジェクトに合わせて確認してください。
付与されているすべての権限を1本のSQLで確認できますか
直接付与、ロール経由、オブジェクト権限、現在有効な権限は確認先が異なるため、複数ビューを組み合わせます。
一覧を作成することはできますが、付与経路や現在の有効状態を区別できる構成にする必要があります。
最初から1本にまとめるより、各ビューの結果を個別に確認したほうが原因を切り分けやすい場合があります。
USER_SYS_PRIVSにない権限を使えるのはなぜですか
ロール経由の可能性があるため、USER_ROLE_PRIVS、ROLE_SYS_PRIVS、SESSION_PRIVSを確認します。
SESSION_PRIVSに権限が表示される場合は、現在のセッションで利用可能な経路が存在すると考えられます。
どのロールから利用可能になっているかを確認するには、付与ロールとロール内部の権限を照合します。
USER_TAB_PRIVSが0件でも問題ありませんか
所有オブジェクト、ロール経由、検索条件や参照先の違いがあるため、0件だけでは異常と判断できません。
対象OWNERとTABLE_NAMEを確認し、シノニムやロール経由の権限も調べます。
他ユーザーの付与状況が必要な場合は、管理者にDBA_TAB_PRIVSの確認を依頼します。
権限を付与してもORA-01031が解消しないのはなぜですか
付与先、対象スキーマ、必要な権限、現在のセッション、PL/SQLの実行方式を順番に確認します。
付与した権限とエラーが発生した操作が一致していない場合は、別の権限が必要になることがあります。
SQLクライアントでは成功してアプリケーションで失敗する場合は、接続ユーザーや接続先の違いも確認します。
他のユーザーの権限を一般ユーザーから確認できますか
確認範囲は付与された参照権限に限られるため、全体は管理者へ依頼します。
一般ユーザー自身の情報はUSER系とSESSION系ビューで確認できます。
管理者へ依頼するときは、対象ユーザー、操作、オブジェクト、接続先、確認済みSQLをまとめて伝えます。
まとめ
Oracleの権限不足は、直接付与、ロール経由、現在有効な状態の順に確認すると切り分けやすくなります。
実行ユーザー、接続先、対象OWNERを確定し、確認できない範囲は結果を整理してDBAへ相談してください。
USER_SYS_PRIVSだけで判断せず、USER_TAB_PRIVS、USER_ROLE_PRIVS、ROLE系ビュー、SESSION系ビューを目的に応じて組み合わせます。
権限が表示されない場合は、未付与だけでなく、対象違い、ロール経由、セッション状態、検索条件も確認します。
必要以上に強い権限を追加する前に、どの操作でどの権限が不足しているかを特定することが大切です。