web-dev-qa-db-ja.com

Oracle 12cのロールを介したユーザー特権の付与に関する問題

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ユーザーがロールから特権を継承したのか、私が思ったように継承していないのでしょうか。私はあなたの洞察に感謝します:)

ありがとうございました!

3
wertyq

あなたはそれについて言及しませんでしたが、これはPL/SQLを使用する場合には非常に典型的です。

ロールを介して付与された権限は、定義者権限で実行するように定義されている名前付きPL/SQLブロックでは無効になります。

PL/SQLブロックでのロールの仕組み

定義者権限で実行される名前付きPL/SQLブロック(ストアドプロシージャ、関数、またはトリガー)では、すべてのロールが無効になります。ロールは特権チェックには使用されず、定義者の権利の手順内でロールを設定することはできません。

詳細については、上記のドキュメントをご覧ください。

可能な回避策には、(すでに行ったように)特権を直接付与するか、または実行者の権限で実行するPL/SQLプログラムユニットを定義することが含まれます。

12cから始まる別の可能性として、PL/SQLプログラム単位にロールを付与できます。したがって、動的SQLを使用してp1というプロシージャでテーブルを作成する場合は、上記のロールを次のように付与できます。

grant wertyq_usr_role to procedure p1;

ニーズに合ったものを選択してください。

6
Balazs Papp