Oracle 11gデータベースで次のシナリオを検討してください。
ユーザーADMINは以下を実行します。
CREATE USER Alice IDENTIFIED BY pwdalice;
GRANT CREATE SESSION TO Alice;
CREATE ROLE Viewer IDENTIFIED BY pwdviewer;
GRANT Viewer TO Alice;
GRANT SELECT ON Table_1 TO Viewer;
次に、アリスはデータベースに「アリス」としてログインし、次のコマンドを実行します。
SELECT * FROM Table_1;
アリスは次のエラーを受け取ります:
SELECT * FROM Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
ロールに特権を付与すると、そのメンバーユーザーがそれらの特権を取得できるようになると思いました。ただし、このシナリオはそうではないことを示しています。ここで何が欠けていますか?ロールを使用してSELECTをアリスに付与するにはどうすればよいですか?
役立つ回答に続き、3つの修正を試みましたが成功しませんでした
SELECT * FROM Table_1;
コマンドにスキーマ名を含めることができませんでした。ただし、以下に示すようにスキーマ名を追加した後でも、エラーが発生します。
アリスは実行します:
SELECT * FROM ADMIN.Table_1;
エラーを取得します。
SELECT * FROM ADMIN.Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
残念ながら、これでも問題は解決されないようです。
アリスは以下を実行します。
CREATE SYNONYM Syn_Table_1 FOR ADMIN.Table_1;
CREATE SYNONYM Syn_Table_1 FOR ADMIN.Table_1
*
ERROR at line 1:
ORA-01031: insufficient privileges
ALTER SESSION SET current_schema = ADMIN;
Session altered.
SELECT * FROM Table_1;
SELECT * FROM Table_1
*
ERROR at line 1:
ORA-00942: table or view does not exist
正しいスキーマにいることを確認することに加えて、これを試してください。
Aliceとしてログインしたら、次の操作を行います:SET ROLE Viewer IDENTIFIED BY pwdviewer;
詳しくは こちら をご覧ください
作成したロールはパスワードで保護されています。したがって、aliceがログインしたとき、デフォルトでは有効になっていません。
Alice
はテーブルを所有していないため、テーブルの完全修飾名を使用する必要があります。
たとえば、テーブルがTABLE_1_OWNER
によって所有されている場合:
SELECT * FROM TABLE_1_OWNER.TABLE_1;
`アリスは自分のスキーマに、テーブルを指すシノニムを作成することもできるため、名前を完全に修飾する必要がなくなります。
CREATE SYNONYM TABLE_1 FOR TABLE_1_OWNER.TABLE_1;
問題は名前解決の問題であり、特権ではありません。
テーブルtable_1
は、Alice
スキーマ以外のスキーマに存在します。 Alice
がクエリを実行するとき
SELECT *
FROM table_1
Oracleは現在のスキーマを調べて、table_1
という名前のオブジェクトがあるかどうかを確認します。そのようなオブジェクトがないため、エラーがスローされます。
テーブル名を修飾することで、オブジェクトがどのスキーマにあるかをOracleに通知することで、これを修正できます。
SELECT *
FROM <<owner of table_1>>.table_1
または、マッピングを提供するシノニム(パブリックまたはプライベート)を作成できます。たとえば、アリスとして、プライベートシノニムを作成できます
CREATE SYNONYM table_1
FOR <<owner of table_1>>.table_1
それをしたら、アリスは簡単にできます
SELECT *
FROM table_1
アリスのスキーマにtable_1
(実際のテーブルのプライベートシノニム)という名前のオブジェクトがあるためです。
3番目のオプションは、セッションの現在のスキーマを変更することです。繰り返しますが、アリスとして、実行すると
ALTER SESSION SET current_schema = <<owner of table_1>>;
その後、実行できるようになります
SELECT *
FROM table_1
ただし、それを行う場合、テーブル名がAliceスキーマに存在する場合は、完全に修飾する必要があります(もちろん、current_schema
を再度変更しない限り)。
シノニムとロールに付与された特権のベストプラクティスアプローチを適用した後もこの問題が発生する場合は、権限受領者のユーザーアカウントですべてのロールが有効になっていることを確認してください:ALTER USER DEFAULT ROLE ALL
さらに、ロールを介した付与を許可するには、ユーザーとの新しい接続を作成する必要があることがわかります。 「単純な」再接続は機能しません。
この問題を解決していない場合は、まず役割を作成し、対応する権限を追加してください。次に、ユーザーを作成してロールを割り当てます。
この順序で、うまくいくと思います。それは私にとってはうまくいき、あなたが経験していたのと同じ問題を抱えていました。