Oracle 10gの権限に問題があります。誰かが私がこれを理解するのを手伝ってくれることを願っています。
テーブルを含むスキーマがあります。そのテーブルの選択をロールに付与しました。
grant select on user1.example_table to example_role;
次に、その役割をユーザーに付与します。
grant example_role to user2;
次に、user2はそのテーブルの上にビューを作成する必要があります。
create or replace view user2.example_view as
select *
from user1.example_table;
ただし、エラーが発生します。
ORA-01031: insufficient privileges
なんで?ロールを介した選択権限がある場合、なぜそのオブジェクトのビューを作成できないのですか?
オブジェクトが機能するためには、オブジェクトをユーザーに直接付与する必要があることがわかりました。
grant select on user1.example_table to user2;
とにかくこれを行う必要がないのですか?テーブルとユーザーが多く、個々のユーザーに対して100万の異なる権限を維持する必要がないため、ロールを使用したいと思いました。
多くのユーザーがいる場合でも、ユーザーが独自のビューを必要とすることはまれです。ビューは1つのスキーマ(おそらくテーブルを所有するスキーマ)にある必要があり、ユーザーはスキーマ名にプレフィックスを付けるか(vwowner.viewなど)、または
ALTER SESSION SET_CURRENT_SCHEMA=vwowner
役割は一時的です。 SET ROLE NONEを実行して、それらをすべてオフにすることができます。異なる役割を有効にして、同じアカウントに複数のセッションを設定できます。これは、Oracleがオブジェクトを処理する方法と互換性がありません(オブジェクトが有効であるか無効であるか、一部のセッションでは有効にできず、他のセッションでは有効にできない)。
マニュアルから:
http://download.Oracle.com/docs/cd/B19306_01/server.102/b14200/statements_8004.htm#i206551
ビューを含むスキーマの所有者は、ビューの基になっているすべてのテーブルまたはビューから行を選択、挿入、更新、または削除するために必要な特権を持っている必要があります。 所有者には、ロールではなく、これらの特権を直接付与する必要があります。
(私による強調)
したがって、この問題を回避する方法はないと思います。
簡単な説明はソフトウェアはそれを可能にするように設計されていなかったです。ゲイリーが指摘したように、役割はビューをオンまたはオフにできるように設計されているため、ビューは一部のセッションでは有効であるが、他のセッションでは有効ではない場合があります。ただし、システムは役割が機能するように設計できます。
必要なのは、永続的な役割、または常にオンで無効にできない役割に類似したデバイスです。これは、別のスキーマのデータを現在のスキーマのデータに結合するビューなどの状況で、Oracleに役立つ追加です。少数のスキーマでも数個のテーブルのみでこれを実行している場合、永続的なロールの時間とメンテナンスの節約は価値があります。
回避策として、特定のユーザーに一連のテーブルに対する権限を付与するプロシージャを作成し、ロールを付与する各ユーザーに対してそれを実行することができます。プロシージャにロール名を渡して、必要なものを生成させることもできるかもしれませんが、結局のところ、それはまだお粗末なソリューションです。