Oracle 12cの学習を始めているので、私の悪い用語を言い訳してください。ユーザーと権限を設定するために、この基本的なスクリプトを書きました。
CREATE USER wertyq_db_usr IDENTIFIED BY justatest ACCOUNT UNLOCK DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" PROFILE "DEFAULT";
ALTER USER wertyq_db_usr QUOTA 100M ON USERS;
GRANT RESOURCE, CONNECT TO wertyq_db_usr;
GRANT EXECUTE ON CTX_DDL TO wertyq_db_usr;
GRANT EXECUTE ON "CTXSYS"."CTX_DDL" TO wertyq_db_usr;
GRANT UNLIMITED TABLESPACE TO wertyq_db_usr;
CREATE ROLE wertyq_usr_role;
GRANT CREATE PROCEDURE TO wertyq_usr_role;
GRANT CREATE TRIGGER TO wertyq_usr_role;
GRANT CREATE SESSION TO wertyq_usr_role;
GRANT CREATE VIEW TO wertyq_usr_role;
GRANT wertyq_usr_role TO wertyq_db_usr;
目標は、ユーザーとロールを作成し、ロールに特権を付与し、ユーザーにロールを割り当てて、ユーザーが特権を継承するようにすることです。また、SYSTEM
ユーザーとしてデータベースに接続できることにも触れておきます。
ただし、私が使用しているサードパーティ製のアプリケーションも、上記で作成したこのユーザーを使用してOracleデータベースに接続する必要があります。これは、ユーザーに権限がなく、データベースにテーブルやビューなどを作成しないように動作します。 。そのため、ユーザーに直接権限を付与すると、サードパーティのアプリケーションが正しく機能します。そのため、ユーザーから特権を削除し、ユーザーにロールを再度付与します。サードパーティのアプリケーションは、テーブルやビューなどを作成しません。
それで、サードパーティのアプリケーションにバグがあるのか、それともOracleユーザーがロールから特権を継承したのか、私が思ったように継承していないのでしょうか。私はあなたの洞察に感謝します:)
ありがとうございました!
あなたはそれについて言及しませんでしたが、これはPL/SQLを使用する場合には非常に典型的です。
ロールを介して付与された権限は、定義者権限で実行するように定義されている名前付きPL/SQLブロックでは無効になります。
定義者権限で実行される名前付きPL/SQLブロック(ストアドプロシージャ、関数、またはトリガー)では、すべてのロールが無効になります。ロールは特権チェックには使用されず、定義者の権利の手順内でロールを設定することはできません。
詳細については、上記のドキュメントをご覧ください。
可能な回避策には、(すでに行ったように)特権を直接付与するか、または実行者の権限で実行するPL/SQLプログラムユニットを定義することが含まれます。
12cから始まる別の可能性として、PL/SQLプログラム単位にロールを付与できます。したがって、動的SQLを使用してp1
というプロシージャでテーブルを作成する場合は、上記のロールを次のように付与できます。
grant wertyq_usr_role to procedure p1;
ニーズに合ったものを選択してください。