9.6 実行者権限を使用した再利用コード

任意のスキーマで使用できる汎用オブジェクト型を作成するには、CREATE OR REPLACE TYPEAUTHID 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