9.6 実行者権限を使用した再利用コード
任意のスキーマで使用できる汎用オブジェクト型を作成するには、CREATE
OR
REPLACE
TYPE
のAUTHID
CURRENT_USER
オプションを介して、実行者権限を使用する型を定義する必要があります。
注意:
実行者権限の制御の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
一般に、次の条件がいずれも真である場合に実行者権限を使用します。
-
データにアクセスし操作するタイプ・メソッドがある。
-
これらのタイプ・メソッドを定義していないユーザーによって使用される必要がある。
たとえば、HRによって「静的メソッド」で作成されたatype
型に対する実行権限を、ユーザーOE
に付与し、その後この型に基づいて表atab
を作成できます。
GRANT EXECUTE ON atype TO oe;
CONNECT oe;
Enter password: password
CREATE TABLE atab OF HR.atype ;
ここで、ユーザーOE
が、次の文でatype
を使用するとします。
BEGIN -- follwing call raises an error, insufficient privileges HR.atype.newa(1, 'atab', 'OE'); END; /
型定義者(HR
)には、newa
プロシージャで挿入を実行するために必要な権限がないため、この文を実行するとエラーが戻されます。このエラーは、実行者権限を使用してatype
を定義することによって回避できます。ここで、まず両方のスキーマのatab
表を削除し、実行者権限を使用してatype
を再作成します。
DROP TABLE atab;
CONNECT hr;
Enter password: password
DROP TABLE atab; DROP TYPE atype FORCE; COMMIT; CREATE TYPE atype AUTHID CURRENT_USER AS OBJECT( a1 NUMBER, STATIC PROCEDURE newa(p1 NUMBER, tabname VARCHAR2, schname VARCHAR2)); / CREATE TYPE BODY atype AS STATIC PROCEDURE newa(p1 NUMBER, tabname VARCHAR2, schname VARCHAR2) IS sqlstmt VARCHAR2(100); BEGIN sqlstmt := 'INSERT INTO '||schname||'.'||tabname|| ' VALUES (HR.atype(:1))'; EXECUTE IMMEDIATE sqlstmt USING p1; END; END; /
これで、ユーザーOE
が再度atype
を使用しようとした場合、文は正常に実行されます。
GRANT EXECUTE ON atype TO oe; CONNECT oe; Enter password: password CREATE TABLE atab OF HR.atype; BEGIN HR.atype.newa(1, 'atab', 'OE'); END; / DROP TABLE atab; CONNECT hr; Enter password: password
DROP TYPE atype FORCE;
このとき文が正常に実行されるのは、プロシージャは定義者(HR
)権限でなく実行者(OE
)権限で実行されるためです。
型階層内では、サブタイプには、そのすぐ上のスーパータイプと同じ権限モデルが存在します。つまり、サブタイプはスーパータイプの権限を暗黙的に継承するため、明示的な権限の指定はできません。さらに、スーパータイプが定義者権限によって宣言された場合は、サブタイプはスーパータイプと同じスキーマ内に配置されている必要があります。これらの規則によって、実行者権限型の階層がスキーマを超えて展開されることになります。ただし、定義者権限モデルを使用する型の階層は、単一のスキーマ内に存在する必要があります。次に例を示します。
CREATE TYPE deftype1 AS OBJECT (...); --Definer-rights type CREATE TYPE subtype1 UNDER deftype1 (...); --subtype in same schema as supertype CREATE TYPE schema2.subtype2 UNDER deftype1 (...); --ERROR CREATE TYPE invtype1 AUTHID CURRENT_USER AS OBJECT (...); --Invoker-rights type CREATE TYPE schema2.subtype2 UNDER invtype1 (...); --LEGAL